国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

jQuery選擇器源碼解讀(四):tokenize方法的Expr.preFilter

2024-05-06 16:17:56
字體:
供稿:網(wǎng)友

這篇文章主要介紹了jQuery選擇器源碼解讀(四):tokenize方法的Expr.preFilter,本文用詳細(xì)的注釋解讀了tokenize方法的Expr.preFilter的實現(xiàn)源碼,需要的朋友可以參考下

Expr.preFilter是tokenize方法中對ATTR、CHILD、PSEUDO三種選擇器進行預(yù)處理的方法。具體如下:

 

 
  1. Expr.preFilter : { 
  2. "ATTR" : function(match) { 
  3. /* 
  4. * 完成如下任務(wù): 
  5. * 1、屬性名稱解碼 
  6. * 2、屬性值解碼 
  7. * 3、若判斷符為~=,則在屬性值兩邊加上空格 
  8. * 4、返回最終的mtach對象 
  9.  
  10. * match[1]表示屬性名稱, 
  11. * match[1].replace(runescape, funescape):將屬性名稱中的十六進制數(shù)解碼成 
  12. * 單字節(jié)unicode字符或雙字節(jié)unicode字符(中文或其它需要兩個字節(jié)表達(dá)的文字) 
  13. * 正則表達(dá)式的詳細(xì)說明,可以參看我的“詳解jQuery選擇器正則表達(dá)式”文章 
  14. */ 
  15. match[1] = match[1].replace(runescape, funescape); 
  16.  
  17. /* 
  18. * 將屬性值解碼 
  19. * match[4]:表示放在單引號或雙引號內(nèi)的屬性值 
  20. * match[5]: 表示不用引號括起來的屬性值 
  21. */ 
  22. match[3] = (match[4] || match[5] || "").replace(runescape, 
  23. funescape); 
  24.  
  25. /* 
  26. * ~=的意思是單詞匹配,在W3C中對單詞的定義是以空白為不同單詞的分隔符 
  27. * 故此處在match[3]兩邊加上空格后,可以利用indexOf,正確識別出該單詞是否存在 
  28. */ 
  29. if (match[2] === "~=") { 
  30. match[3] = " " + match[3] + " "
  31.  
  32. /* 
  33. * 返回有用的前四個元素結(jié)果 
  34. */ 
  35. return match.slice(0, 4); 
  36. }, 
  37.  
  38. "CHILD" : function(match) { 
  39. /* 
  40. * 完成如下幾項任務(wù): 
  41. * 1、把命令中child和of-type之前的字符變成小寫字符 
  42. * 2、對于nth開頭的選擇器檢查括號內(nèi)的數(shù)據(jù)有效性 
  43. * 3、match[4]和match[5]分別存放xn+b中的x和b,x和b允許是負(fù)數(shù) 
  44. * 4、返回最終的match對象 
  45.  
  46. * match[1]:(only|first|last|nth|nth-last)中的一個 
  47. */ 
  48. match[1] = match[1].toLowerCase(); 
  49.  
  50. /* 
  51. * 對于nth-child、nth-of-type、nth-last-child、nth-last-of-type四種類型括號內(nèi)需設(shè)置有效數(shù)據(jù) 
  52. * 而其它則括號內(nèi)不允許有任何數(shù)據(jù) 
  53. */ 
  54. if (match[1].slice(0, 3) === "nth") { 
  55. /* 
  56. * 若選擇器括號內(nèi)沒有有效參數(shù),則拋出異常 
  57. * 舉例:若選擇器是nth或nth(abc)則屬于非法選擇器 
  58. */ 
  59. if (!match[3]) { 
  60. Sizzle.error(match[0]); 
  61. /* 
  62. * 下面先以nth-child()為例介紹一下語法,以便更好的理解下面代碼的作用 
  63. * nth-child允許的幾種使用方式如下: 
  64. * :nth-child(even) 
  65. * :nth-child(odd) 
  66. * :nth-child(3n) 
  67. * :nth-child(+2n+1) 
  68. * :nth-child(2n-1) 
  69. * 下面代碼中賦值號左側(cè)的match[4]、match[5]用于分別記錄括號內(nèi)n前及n后的數(shù)值,包括正負(fù)號 
  70. * 對于:nth-child(even)和:nth-child(odd)來說,match[4]為空, 
  71. * 所以返回 2 * (match[3] === "even" || match[3] === "odd")的計算結(jié)果 
  72. * 因為在js中true=1,false=0,所以(match[3] === "even" || match[3] === "odd")等于1 
  73. * 因此,2 * (match[3] === "even" || match[3] === "odd")的計算結(jié)果為2 
  74.  
  75. * 等號右側(cè)的“+”的作用是強制類型轉(zhuǎn)換,將之后的字符串轉(zhuǎn)換成數(shù)值類型  
  76. */ 
  77. match[4] = +(match[4] ? match[5] + (match[6] || 1) 
  78. : 2 * (match[3] === "even" || match[3] === "odd")); 
  79. match[5] = +((match[7] + match[8]) || match[3] === "odd"); 
  80.  
  81. else if (match[3]) { 
  82. /* 
  83. * 若非nth起頭的其它CHILD類型選擇器帶有括號說明,則拋出異常 
  84. * 這里jQuery并沒有嚴(yán)格按照W3C的規(guī)則來判定,因為其允許:first-child()的這種形式存在 
  85. * 也就是對于jQuery來說:first-child()等同于:first-child,是合法選擇器 
  86. */ 
  87. Sizzle.error(match[0]); 
  88.  
  89. return match; 
  90. }, 
  91.  
  92. "PSEUDO" : function(match) { 
  93. /* 
  94. * 完成如下任務(wù): 
  95. * 1、獲取偽類中用引號括起來的值 
  96. * 2、對于非引號括起來的值,若存在偽類嵌套,則進一步解析確定當(dāng)前偽類實際結(jié)束位置, 
  97. * 獲取當(dāng)前偽類的完整字符串和值 
  98. * 3、返回match中的前三項的副本。 
  99.  
  100. * unquoted表示括號內(nèi)非引號括起來的值, 
  101. * 以:eq(2)為例,unquoted=2 
  102. */ 
  103. var excess, unquoted = !match[5] && match[2]; 
  104.  
  105. /* 
  106. * 因為pseudo與child的匹配正則表達(dá)式有交集,所以,需要把屬于child的部分忽略掉 
  107. */ 
  108. if (matchExpr["CHILD"].test(match[0])) { 
  109. return null
  110. /* 
  111. * 若括號內(nèi)的值使用引號(match[3])括起來的, 
  112. * 則將除引號外的值(match[4])賦給match[2]。 
  113. * match[3]表示引號。 
  114. */ 
  115. if (match[3] && match[4] !== undefined) { 
  116. match[2] = match[4]; 
  117. else if (unquoted 
  118. /* 
  119. * rpseudo.test(unquoted):用來測試unquoted是否包含偽類, 
  120. * 若包含偽類,則說明有可能存在偽類嵌套的可能性,需要進一步對unquoted進行解析 
  121. * 例如: :not(:eq(3)) 
  122. */ 
  123. && rpseudo.test(unquoted) 
  124. && 
  125. /* 
  126. * 獲取unquoted中連續(xù)有效地選擇器最后一個字符所在位置 
  127. */ 
  128. (excess = tokenize(unquoted, true)) 
  129. && 
  130. /* 
  131. * unquoted.indexOf(")", unquoted.length - excess) 
  132. * 從之前獲得的連續(xù)有效地選擇器最后一個字符所在位置之后找到")"所在位置, 
  133. * 通常就在當(dāng)前位置之后。 
  134. * 再減去unquoted.length,用來獲得match[0]中的有效完整的偽類字符串最后位置, 
  135. * 注意,此時excess是一個負(fù)值 
  136.  
  137. */ 
  138. (excess = unquoted.indexOf(")", unquoted.length 
  139. - excess) 
  140. - unquoted.length)) { 
  141.  
  142. // 獲取有效的完整偽類match[0]和偽類括號內(nèi)的數(shù)據(jù)match[2] 
  143. match[0] = match[0].slice(0, excess); 
  144. match[2] = unquoted.slice(0, excess); 
  145.  
  146. // 返回match前三個元素的副本 
  147. return match.slice(0, 3); 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 扎囊县| 延安市| 环江| 浙江省| 饶河县| 肥城市| 太谷县| 永善县| 青岛市| 宽城| 土默特左旗| 天水市| 来宾市| 新竹市| 宁夏| 高清| 尼勒克县| 紫云| 光泽县| 台东县| 阜南县| 大庆市| 越西县| 南通市| 营山县| 兴安盟| 博爱县| 清涧县| 盘山县| 安陆市| 湄潭县| 岐山县| 繁峙县| 怀来县| 沈阳市| 罗城| 钟祥市| 敦煌市| 兴安县| 江源县| 陆丰市|