日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jquery 源码分析九 - Sizzle

發布時間:2025/6/17 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jquery 源码分析九 - Sizzle 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近一直在搞畢設,實在是沒時間寫博客了,零碎的時間看代碼進度也不快,所以寫博客一拖再拖了,今天先補一篇上來。。。

在上次寫得setDocument以后,緊接著的是一些零碎的功能函數

1 Sizzle.matches = function( expr, elements ) { 2 return Sizzle( expr, null, null, elements ); 3 }; 4 5 Sizzle.matchesSelector = function( elem, expr ) { 6 // 設置document以防萬一 7 if ( ( elem.ownerDocument || elem ) !== document ) { 8 setDocument( elem ); 9 } 10 11 // 確保屬性值被引號包裹 12 expr = expr.replace( rattributeQuotes, "='$1']" ); 13 14 if ( support.matchesSelector && documentIsHTML && 15 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && 16 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 17 18 try { 19 var ret = matches.call( elem, expr ); 20 21 // 在IE9下matchesSelector會返回false(在IE10+情況下,開發者模式調到IE9,8是正常的,IETester下返回false) 22 if ( ret || support.disconnectedMatch || 23 // 同樣的,在IE9下,這種無關節點被認為是在文檔片段中 24 elem.document && elem.document.nodeType !== 11 ) { 25 return ret; 26 } 27 } catch(e) {} 28 } 29 30 return Sizzle( expr, document, null, [elem] ).length > 0; 31 }; 32 33 Sizzle.contains = function( context, elem ) { 34 // 設置document 35 if ( ( context.ownerDocument || context ) !== document ) { 36 setDocument( context ); 37 } 38 return contains( context, elem ); 39 }; 40 41 Sizzle.attr = function( elem, name ) { 42 // 設置document 43 if ( ( elem.ownerDocument || elem ) !== document ) { 44 setDocument( elem ); 45 } 46 47 var fn = Expr.attrHandle[ name.toLowerCase() ], 48 // 防止取到Object.prototype里的屬性 (jQuery #13807) 49 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 50 fn( elem, name, !documentIsHTML ) : 51 undefined; 52 53 return val !== undefined ? 54 val : 55 support.attributes || !documentIsHTML ? 56 elem.getAttribute( name ) : 57 (val = elem.getAttributeNode(name)) && val.specified ? 58 val.value : 59 null; 60 }; 61 62 Sizzle.error = function( msg ) { 63 throw new Error( "Syntax error, unrecognized expression: " + msg ); 64 };

在這邊,Sizzle.matches和Sizzle.matchesSelector在最后都是以return Sizzle( expr, null, null, elements )形式返回的,由于在Sizzle中,在第四項有值時,就會跳過一個大的if語句塊

if ( documentIsHTML && !seed ) { }

然后會直接跳到最后執行select函數

return select( selector.replace( rtrim, "$1" ), context, results, seed );

對于select函數,先放一下。。。等看到的時候再分析。。。

接下來的是一個主要剔除重復+排序的函數,源碼如下:

Sizzle.uniqueSort = function( results ) {var elem,duplicates = [],j = 0,i = 0;// 默認確實有重復hasDuplicate = !support.detectDuplicates;sortInput = !support.sortStable && results.slice( 0 );results.sort( sortOrder );if ( hasDuplicate ) {while ( (elem = results[i++]) ) {if ( elem === results[ i ] ) {j = duplicates.push( i );}}while ( j-- ) {results.splice( duplicates[ j ], 1 );}}// See https://github.com/jquery/sizzle/pull/225sortInput = null;return results; };

在這里一開始先默認確實有重復項,然后在result.sort的時候,用sortOrder來排序,這個函數在setDocument中定義了,其中有一段就是設置hasDuplicate的:

if ( a === b ) {hasDuplicate = true; }

注:hasDuplicate在Sizzle閉包作用域中屬于全局變量。

然后是一個拿元素內文本內容的函數,主要調用了textContent,源碼如下:

1 getText = Sizzle.getText = function( elem ) { 2 var node, 3 ret = "", 4 i = 0, 5 nodeType = elem.nodeType; 6 7 if ( !nodeType ) { 8 // 如果沒有nodeType,那么就認為是一個普通數組 9 while ( (node = elem[i++]) ) { 10 ret += getText( node ); 11 } 12 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { 13 // 對于元素用textContent 14 // innerText 已被移除 15 if ( typeof elem.textContent === "string" ) { 16 return elem.textContent; 17 } else { 18 // 對子節點遍歷 19 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 20 ret += getText( elem ); 21 } 22 } 23 } else if ( nodeType === 3 || nodeType === 4 ) { 24 return elem.nodeValue; 25 } 26 // 排除注釋節點 27 28 return ret; 29 };

它用了一個遞歸調用的方法,防止注釋等節點的混入。

在后面就是一個

1 Expr = Sizzle.selectors = { 2 // ..... 3 }

這里放了許多關于篩選元素的函數,暫時先跳過了。下一篇的話從后面的tokenize開始講。明后天估計還是要去實驗室搬磚,爭取在零碎時間多看看源碼,早點把下一篇發上來。。。

這篇好像有點短了。。。

?

轉載于:https://www.cnblogs.com/cyITtech/p/3650885.html

總結

以上是生活随笔為你收集整理的jquery 源码分析九 - Sizzle的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区二区三区蜜桃 | av天天色| 欧美国产日韩在线观看成人 | 亚洲毛片在线看 | 亚洲欧美小视频 | 成人毛片视频在线观看 | 国产三级一区二区 | 一对一色视频聊天a | 一区二区三区中文字幕在线观看 | 国产精品丝袜一区 | 国产精品无码人妻一区二区在线 | 午夜偷拍视频 | 欧美成人黄色 | 国产女主播一区二区三区 | 亚洲天堂女人 | 国产男女精品 | 99riav在线 | 毛片一区二区 | av收藏小四郎最新地址 | 少妇一级淫片免费观看 | 精品国产一级久久 | 日韩精品久久一区二区 | 国产伦精品一区二区三区视频痴汉 | 日本不卡在线视频 | av资源导航 | 五月天激情综合网 | 97精品一区二区三区 | 最新国产拍偷乱偷精品 | 欧美精品一 | 麻豆国产网站 | 久久久久久蜜桃一区二区 | 超碰在线免费播放 | 中国老熟女重囗味hdxx | 日本护士毛茸茸 | 成人无高清96免费 | 亚洲三级在线播放 | 小香蕉av | 欧美性色黄大片手机版 | 男人天堂最新网址 | 蜜臀久久99静品久久久久久 | 国产高清一二三区 | 久久久久久蜜桃 | 亚洲a级片| 亚洲一区二区三区久久久成人动漫 | 亚洲久久天堂 | 97香蕉超级碰碰久久免费软件 | 精品国产aⅴ麻豆 | 小优视频污 | 精品人妻一区二区三区香蕉 | 色综合网站 | 女同性恋毛片 | 在线精品一区二区三区 | 国产www色| 红桃成人在线 | 成人免费看片39 | 欧美黄在线观看 | 日韩av在线播放一区 | 国产精品探花视频 | 国产另类xxxxhd高清 | 亚洲一区二区影视 | 亚洲第一色区 | 依人综合网 | 亚洲欧美在线一区二区 | 久久黄色网络 | www.视频一区 | 天天综合中文字幕 | 亚洲涩涩 | 夜夜夜夜夜操 | 国产农村妇女精品一区 | 中文久久久 | 日韩高清二区 | 国产成人黄色av | 日本精品视频在线 | 亚洲伊人婷婷 | 精品精品视频 | 欧美在线视频精品 | 国产精品久久一区二区三区动 | 久久日视频 | 一级片在线观看免费 | 国产精品电影一区二区 | 金瓶狂野欧美性猛交xxxx | 桃色视频网站 | 天天爽天天插 | 色多多污污 | 假日游船 | 在线能看的av网站 | 亚洲精品资源在线 | 欧美黄色高清视频 | 亚欧色视频 | 国产黄在线 | 少妇又色又紧又黄又刺激免费 | 欧美性生活精品 | 久久最新网址 | 亚洲男女在线观看 | 国产乱淫视频 | 一乃葵在线| 亚洲精品久久久久久国产精华液 | 欧美无砖专区免费 | 欧美高清成人 |