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

首頁 > 語言 > JavaScript > 正文

jQuery選擇器源碼解讀(二):select方法

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

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

 

 
  1. /* 
  2. * select方法是Sizzle選擇器包的核心方法之一,其主要完成下列任務: 
  3. * 1、調用tokenize方法完成對選擇器的解析 
  4. * 2、對于沒有初始集合(即seed沒有賦值)且是單一塊選擇器(即選擇器字符串中沒有逗號), 
  5. * 完成下列事項: 
  6. * 1) 對于首選擇器是ID類型且context是document的,則直接獲取對象替代傳入的context對象 
  7. * 2) 若選擇器是單一選擇器,且是id、class、tag類型的,則直接獲取并返回匹配的DOM元素 
  8. * 3) 獲取最后一個id、class、tag類型選擇器的匹配DOM元素賦值給初始集合(即seed變量) 
  9. * 3、通過調用compile方法獲取“預編譯”代碼并執行,獲取并返回匹配的DOM元素 
  10.  
  11. * @param selector 已去掉頭尾空白的選擇器字符串 
  12. * @param context 執行匹配的最初的上下文(即DOM元素集合)。若context沒有賦值,則取document。 
  13. * @param results 已匹配出的部分最終結果。若results沒有賦值,則賦予空數組。 
  14. * @param seed 初始集合 
  15. */ 
  16. function select(selector, context, results, seed) { 
  17.  
  18. var i, tokens, token, type, find,  
  19. // 調用tokenize函數解析selector 
  20. match = tokenize(selector); 
  21.  
  22. // 若沒有提供初始集合 
  23. if (!seed) { 
  24. // Try to minimize operations if there is only one group 
  25. // 若只有一組選擇器,即選擇器字符串沒有逗號 
  26. if (match.length === 1) { 
  27. // Take a shortcut and set the context if the root selector 
  28. // is an ID 
  29. /* 
  30. * 下面代碼是用來處理根選擇器是ID類型的快捷方式 
  31.  
  32. * 在此使用slice[0]來創建一個新的集合, 
  33. * 確保原有的集合不會被之后代碼變更掉 
  34. */ 
  35. tokens = match[0] = match[0].slice(0); 
  36. /* 
  37. * 若選擇器是以id類型開始,且第二個是關系符(即+~>或空格), 
  38. * 則獲取id所屬對象作為context繼續完成后續的匹配 
  39.  
  40. * 此處的條件判斷依次為: 
  41. * tokens.length > 2 :若tokens有兩個以上的選擇器 
  42. * (token = tokens[0]).type === "ID" :第一個選擇器的類型為ID(即以#開頭的), 
  43. * support.getById :支持getElementById函數 
  44. * context.nodeType === 9 :context對象是document 
  45. * documentIsHTML :當前處理的是HTML代碼 
  46. * Expr.relative[tokens[1].type] :第二個tokens元素是一個關系(即+~>或空格) 
  47. * 在滿足上面所有條件的情況下,執行if內的語句體 
  48. */ 
  49. if (tokens.length > 2 && (token = tokens[0]).type === "ID" 
  50. && support.getById && context.nodeType === 9 
  51. && documentIsHTML && Expr.relative[tokens[1].type]) { 
  52.  
  53. // 將當前上下文指向第一個ID選擇器指定的節點對象 
  54. context = (Expr.find["ID"](token.matches[0].replace( 
  55. runescape, funescape), context) || [])[0]; 
  56.  
  57. // 若當前上下文內沒有指定ID對象,則直接返回results 
  58. if (!context) { 
  59. return results; 
  60.  
  61. // 選擇器字符串去掉第一個ID選擇器 
  62. selector = selector.slice(tokens.shift().value.length); 
  63.  
  64. // Fetch a seed set for right-to-left matching 
  65. /*  
  66. * 下面while循環的作用是用來根據最后一個id、class、tag類型的選擇器獲取初始集合 
  67. * 舉個簡單例子:若選擇器是"div[title='2']", 
  68. * 代碼根據div獲取出所有的context下的div節點,并把這個集合賦給seed變量, 
  69. * 然后在調用compile函數,產生預編譯代碼, 
  70. * 預編譯代碼完成在上述初始集合中執行[title='2']的匹配 
  71.  
  72. * 首先,檢查選擇器字符串中是否存在與needsContext正則表達式相匹配的字符 
  73. * 若沒有,則將依據選擇器從右到左過濾DOM節點 
  74. * 否則,將先生成預編譯代碼后執行(調用compile方法)。  
  75. */ 
  76.  
  77. /* 
  78. * "needsContext" : new RegExp("^" + whitespace 
  79. * + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?://(" 
  80. * + whitespace + "*((?:-//d)?//d*)" + whitespace 
  81. * + "*//)|)(?=[^-]|$)", "i") 
  82. * needsContext用來匹配選擇器字符串中是否包含下列內容: 
  83. * 1、>+~三種關系符 
  84. * 2、:even、:odd、:eq、:gt、:lt、:nth、:first、:last八種偽類 
  85. * 其中,(?=[^-]|$)用來過濾掉類似于:first-child等帶中杠的且以上述八個單詞開頭的其它選擇器 
  86. */ 
  87. i = matchExpr["needsContext"].test(selector) ? 0 
  88. : tokens.length; 
  89. while (i--) { 
  90. token = tokens[i]; 
  91.  
  92. // Abort if we hit a combinator 
  93. // 遇到關系符跳出循環 
  94. if (Expr.relative[(type = token.type)]) { 
  95. break
  96. if ((find = Expr.find[type])) { 
  97. // Search, expanding context for leading sibling 
  98. // combinators 
  99. /* 
  100. * rsibling = new RegExp(whitespace + "*[+~]") 
  101. * rsibling用于判定token選擇器是否是兄弟關系符 
  102. */ 
  103. if ((seed = find(token.matches[0].replace( 
  104. runescape, funescape), rsibling 
  105. .test(tokens[0].type) 
  106. && context.parentNode || context))) { 
  107.  
  108. // If seed is empty or no tokens remain, we can 
  109. // return early 
  110. // 剔除剛用過的選擇器 
  111. tokens.splice(i, 1); 
  112. selector = seed.length && toSelector(tokens); 
  113. /* 
  114. * 若selector為空,說明選擇器僅為單一id、class、tag類型的, 
  115. * 故直接返回獲取的結果,否則,在獲取seed的基礎上繼續匹配 
  116. */ 
  117. if (!selector) { 
  118. push.apply(results, seed); 
  119. return results; 
  120.  
  121. break
  122.  
  123. // Compile and execute a filtering function 
  124. // Provide `match` to avoid retokenization if we modified the 
  125. // selector above 
  126. /* 
  127. * 先執行compile(selector, match),它會返回一個“預編譯”函數, 
  128. * 然后調用該函數獲取最后匹配結果 
  129. */ 
  130. compile(selector, match)(seed, context, !documentIsHTML, results, 
  131. rsibling.test(selector)); 
  132. return results; 

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品久久久久久777| 亚洲色图欧美制服丝袜另类第一页| 国内精品久久久久影院优| 欧美裸体xxxx极品少妇| 91系列在线观看| 国产精品久久国产精品99gif| 亚洲欧洲一区二区三区久久| 日本精品一区二区三区在线| 欧美日韩亚洲网| 欧美日韩中文字幕| 伊人av综合网| 色噜噜狠狠狠综合曰曰曰88av| 国产在线观看精品一区二区三区| 日韩视频中文字幕| 国产日韩欧美在线播放| 国产精品91视频| 成人在线精品视频| 日韩欧美高清在线视频| 欧美xxxx综合视频| 中文字幕日本欧美| 久久69精品久久久久久久电影好| 81精品国产乱码久久久久久| 午夜精品一区二区三区在线播放| 中文字幕日韩av综合精品| www.亚洲人.com| 亚洲色图欧美制服丝袜另类第一页| 国产精品影片在线观看| 97香蕉超级碰碰久久免费软件| 欧美午夜电影在线| 亚洲第一区在线观看| 日韩电影免费观看在线观看| 久久免费视频在线| 欧美国产在线电影| 国产精品美女在线观看| 96精品久久久久中文字幕| 亚洲人成电影在线| 福利精品视频在线| 欧美激情国产日韩精品一区18| 国产成人精品一区| 国产色综合天天综合网| 国产精品免费观看在线| 亚洲热线99精品视频| 伊人一区二区三区久久精品| 欧美日韩国产123| 91亚洲精华国产精华| 国产精品日本精品| 精品视频一区在线视频| 久久久久久国产三级电影| 久热精品视频在线观看一区| 欧美乱妇40p| 操人视频在线观看欧美| 欧美wwwwww| 国产亚洲激情视频在线| 亚洲一区www| 成人网在线免费看| 亚洲国产欧美久久| 欧美与欧洲交xxxx免费观看| 日韩av网站导航| 国产精品视频精品视频| 高清日韩电视剧大全免费播放在线观看| 中文字幕自拍vr一区二区三区| 国产成人一区二区三区电影| 91亚洲国产成人精品性色| 国产乱人伦真实精品视频| 亚洲一二在线观看| 亚洲 日韩 国产第一| 亚洲国产精品久久久久秋霞蜜臀| 欧美放荡办公室videos4k| 国模精品系列视频| 亚洲四色影视在线观看| 日本中文字幕不卡免费| 九九九热精品免费视频观看网站| 亚洲国产日韩一区| 7m精品福利视频导航| 性欧美视频videos6一9| 日韩欧美中文字幕在线播放| 亚洲一品av免费观看| 亚洲精品白浆高清久久久久久| 丝袜一区二区三区| 亚洲欧美日韩区| 亚洲人成网站999久久久综合| 亚洲成人黄色在线观看| xxxx欧美18另类的高清| 亚洲色图17p| 久久久www成人免费精品张筱雨| 日韩在线观看精品| 日韩免费黄色av| 久久久久久久久久久亚洲| 久久久精品一区二区三区| 色多多国产成人永久免费网站| 成人免费高清完整版在线观看| 欧美大成色www永久网站婷| 亚洲性av网站| 亚洲自拍偷拍区| 久久精品男人天堂| 欧美日韩国产精品专区| 色吧影院999| 国产精品青青在线观看爽香蕉| 欧美日本中文字幕| 亚洲精品之草原avav久久| 最近2019年日本中文免费字幕| 中文字幕日韩精品在线| 精品国产欧美成人夜夜嗨| 国产精品白嫩初高中害羞小美女| 国产欧美va欧美va香蕉在线| 91精品国产色综合久久不卡98口| 国产精品老牛影院在线观看| 欧美日韩不卡合集视频| 国产精品大陆在线观看| 欧美大秀在线观看| 国产免费一区二区三区香蕉精| 国产丝袜一区二区三区免费视频| 日韩欧美大尺度| 日韩黄色高清视频| 亚洲毛片在线免费观看| 亚洲欧美日韩精品久久奇米色影视| 国产精品视频最多的网站| 欧美专区在线视频| 国内精品小视频在线观看| 国产精品草莓在线免费观看| 久久久国产精彩视频美女艺术照福利| 日本乱人伦a精品| 中文字幕精品在线| 欧美精品电影在线| xxxxx成人.com| 国产精品久久久久7777婷婷| 久久精品国产视频| 国产日韩专区在线| 日韩国产激情在线| 久久艳片www.17c.com| 久久成人人人人精品欧| 久久久之久亚州精品露出| 日韩动漫免费观看电视剧高清| 日韩精品视频在线观看免费| 456国产精品| 亚洲欧洲激情在线| 日韩在线观看网站| 91精品国产综合久久香蕉最新版| 日韩中文字幕在线观看| 日韩欧美高清在线视频| 一区国产精品视频| 日韩av免费看网站| 欧美激情精品久久久久久| 91精品国产91久久久久久吃药| 国产99久久精品一区二区| 亚洲国产天堂久久国产91| 日韩成人av网址| 日本高清久久天堂| 国产主播在线一区| 精品国产999| 精品日韩美女的视频高清| 青草热久免费精品视频| 精品久久久久久国产| 一区二区亚洲精品国产| 91网站免费看| 欧美午夜精品在线| 久久成人av网站| 91av视频在线观看| 亚洲欧洲自拍偷拍| 一区二区三区视频在线| 国产91精品久久久久| 国产精品丝袜视频| 91精品国产高清久久久久久久久| 日韩欧美国产免费播放|