亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:17:56
字體:
來源:轉載
供稿:網友

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

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

 

 
  1. Expr.preFilter : { 
  2. "ATTR" : function(match) { 
  3. /* 
  4. * 完成如下任務: 
  5. * 1、屬性名稱解碼 
  6. * 2、屬性值解碼 
  7. * 3、若判斷符為~=,則在屬性值兩邊加上空格 
  8. * 4、返回最終的mtach對象 
  9.  
  10. * match[1]表示屬性名稱, 
  11. * match[1].replace(runescape, funescape):將屬性名稱中的十六進制數解碼成 
  12. * 單字節unicode字符或雙字節unicode字符(中文或其它需要兩個字節表達的文字) 
  13. * 正則表達式的詳細說明,可以參看我的“詳解jQuery選擇器正則表達式”文章 
  14. */ 
  15. match[1] = match[1].replace(runescape, funescape); 
  16.  
  17. /* 
  18. * 將屬性值解碼 
  19. * match[4]:表示放在單引號或雙引號內的屬性值 
  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. * 返回有用的前四個元素結果 
  34. */ 
  35. return match.slice(0, 4); 
  36. }, 
  37.  
  38. "CHILD" : function(match) { 
  39. /* 
  40. * 完成如下幾項任務: 
  41. * 1、把命令中child和of-type之前的字符變成小寫字符 
  42. * 2、對于nth開頭的選擇器檢查括號內的數據有效性 
  43. * 3、match[4]和match[5]分別存放xn+b中的x和b,x和b允許是負數 
  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四種類型括號內需設置有效數據 
  52. * 而其它則括號內不允許有任何數據 
  53. */ 
  54. if (match[1].slice(0, 3) === "nth") { 
  55. /* 
  56. * 若選擇器括號內沒有有效參數,則拋出異常 
  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. * 下面代碼中賦值號左側的match[4]、match[5]用于分別記錄括號內n前及n后的數值,包括正負號 
  70. * 對于:nth-child(even)和:nth-child(odd)來說,match[4]為空, 
  71. * 所以返回 2 * (match[3] === "even" || match[3] === "odd")的計算結果 
  72. * 因為在js中true=1,false=0,所以(match[3] === "even" || match[3] === "odd")等于1 
  73. * 因此,2 * (match[3] === "even" || match[3] === "odd")的計算結果為2 
  74.  
  75. * 等號右側的“+”的作用是強制類型轉換,將之后的字符串轉換成數值類型  
  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并沒有嚴格按照W3C的規則來判定,因為其允許: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. * 完成如下任務: 
  95. * 1、獲取偽類中用引號括起來的值 
  96. * 2、對于非引號括起來的值,若存在偽類嵌套,則進一步解析確定當前偽類實際結束位置, 
  97. * 獲取當前偽類的完整字符串和值 
  98. * 3、返回match中的前三項的副本。 
  99.  
  100. * unquoted表示括號內非引號括起來的值, 
  101. * 以:eq(2)為例,unquoted=2 
  102. */ 
  103. var excess, unquoted = !match[5] && match[2]; 
  104.  
  105. /* 
  106. * 因為pseudo與child的匹配正則表達式有交集,所以,需要把屬于child的部分忽略掉 
  107. */ 
  108. if (matchExpr["CHILD"].test(match[0])) { 
  109. return null
  110. /* 
  111. * 若括號內的值使用引號(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中連續有效地選擇器最后一個字符所在位置 
  127. */ 
  128. (excess = tokenize(unquoted, true)) 
  129. && 
  130. /* 
  131. * unquoted.indexOf(")", unquoted.length - excess) 
  132. * 從之前獲得的連續有效地選擇器最后一個字符所在位置之后找到")"所在位置, 
  133. * 通常就在當前位置之后。 
  134. * 再減去unquoted.length,用來獲得match[0]中的有效完整的偽類字符串最后位置, 
  135. * 注意,此時excess是一個負值 
  136.  
  137. */ 
  138. (excess = unquoted.indexOf(")", unquoted.length 
  139. - excess) 
  140. - unquoted.length)) { 
  141.  
  142. // 獲取有效的完整偽類match[0]和偽類括號內的數據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); 

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美第一页| 欧美最猛性xxxxx免费| 国产精品免费视频久久久| 最近中文字幕2019免费| 国产精品久久久久久久午夜| 欧美高清在线视频观看不卡| 亚洲人成在线电影| 黄色成人在线免费| 亚洲韩国日本中文字幕| 欧美丰满老妇厨房牲生活| 91久久精品久久国产性色也91| 国产视频精品va久久久久久| 欧美丰满片xxx777| 日韩av高清不卡| 国产美女高潮久久白浆| 91国产精品视频在线| www亚洲欧美| 91欧美激情另类亚洲| 精品一区二区三区电影| 午夜精品久久久久久久99热| 亚洲成人激情小说| 色伦专区97中文字幕| 77777亚洲午夜久久多人| 91久久嫩草影院一区二区| 日韩免费黄色av| 亚洲综合色av| 性日韩欧美在线视频| 91在线观看免费高清完整版在线观看| 亚洲成年人在线| 久久久噜噜噜久噜久久| 全亚洲最色的网站在线观看| 日本精品一区二区三区在线播放视频| 日韩免费电影在线观看| 欧美性视频网站| 久久精品99国产精品酒店日本| 中文字幕亚洲精品| 国产成人精品免高潮在线观看| 国产精品视频精品视频| 97视频在线播放| 欧美日韩国产丝袜美女| 国产精品久久久久久久9999| 欧美成人一区二区三区电影| 欧美精品日韩www.p站| 欧美日韩黄色大片| 日韩中文在线不卡| 亚洲区免费影片| 日韩精品黄色网| 97av在线播放| 欧美成人一区二区三区电影| 欧美成人性生活| 在线成人激情黄色| 亚洲香蕉在线观看| 久久国产精品99国产精| 亚洲free嫩bbb| 国产成人精品一区二区在线| 欧美国产日本高清在线| 日韩中文字幕国产精品| 欧美午夜激情小视频| 国产成人久久精品| 欧美日韩国产一区在线| 日韩av成人在线观看| 日韩高清中文字幕| 亚洲电影免费观看高清完整版在线观看| 精品国产一区二区三区久久| 91精品久久久久久久久久另类| 2019中文字幕全在线观看| 成人精品视频久久久久| 4438全国亚洲精品在线观看视频| 欧美性极品少妇精品网站| 欧美亚洲另类视频| 91亚洲一区精品| 亚洲欧美激情视频| 国产精品678| 日韩免费观看在线观看| 91免费高清视频| 亚洲aⅴ男人的天堂在线观看| 色七七影院综合| 亚洲欧美日韩一区二区三区在线| 欧美韩日一区二区| 日韩国产高清视频在线| 奇米四色中文综合久久| 在线观看中文字幕亚洲| 日韩av电影在线免费播放| 国产精品黄页免费高清在线观看| 国产免费一区视频观看免费| 欧美激情久久久久| www.亚洲免费视频| 国产精品综合不卡av| 欧美精品在线免费播放| 欧美日韩色婷婷| 国产欧美精品日韩精品| 欧美在线精品免播放器视频| 欧美精品制服第一页| 亚洲a一级视频| 精品欧美aⅴ在线网站| 欧美午夜久久久| 亚洲2020天天堂在线观看| 亚洲第一国产精品| 欧美日本高清一区| 欧美激情免费视频| 欧美激情欧美激情在线五月| 亚洲人成电影网站色| 精品偷拍各种wc美女嘘嘘| 成人福利网站在线观看11| 青青久久av北条麻妃黑人| 欧美日韩国产区| 日本高清视频一区| 中文字幕国产亚洲2019| 国产精品久久久久久超碰| 精品美女久久久久久免费| 黄网站色欧美视频| 午夜精品理论片| 亚洲黄色在线观看| 国产日韩综合一区二区性色av| 精品视频一区在线视频| 日韩av在线精品| 色系列之999| 亚洲国产中文字幕在线观看| 久久久久久久久久久av| 午夜精品福利在线观看| 国产精品旅馆在线| 亚洲综合中文字幕在线| 久久电影一区二区| 日本国产一区二区三区| 亚洲国产成人在线视频| 成人h片在线播放免费网站| 亚洲国产天堂网精品网站| 亚洲第一区中文字幕| 日日摸夜夜添一区| 一区二区三区视频观看| 日韩一区av在线| 欧美日韩高清在线观看| 欧美成人中文字幕在线| 色视频www在线播放国产成人| 久久精品电影网站| 亚洲一区免费网站| 日韩中文字幕欧美| 国产精品视频一区二区高潮| 欧美大片大片在线播放| 97国产一区二区精品久久呦| 色综合亚洲精品激情狠狠| 青草青草久热精品视频在线网站| 欧美日韩在线观看视频小说| 欧美一区二区色| 亚洲精品一区中文字幕乱码| 久热国产精品视频| 亚洲第一页自拍| 欧美做受高潮电影o| 国产亚洲成精品久久| 久久视频精品在线| 久久久久九九九九| 精品国产乱码久久久久久婷婷| 亚洲人成电影网站色| 国产美女精品视频免费观看| 国精产品一区一区三区有限在线| 亚洲高清一二三区| 亚洲肉体裸体xxxx137| 欧美亚洲另类制服自拍| 成人xxxx视频| 亚洲香蕉av在线一区二区三区| 久久精品国产69国产精品亚洲| 国产精品美女www| 欧洲日韩成人av| 国产精品福利网|