精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何理解與簡化jQuery的closest函數

開發 前端
在實現delegate方法中,有一個很重要的輔助函數叫closest,雖然現在它歸類為遍歷節點這個模塊中。這個函數實現得非常復雜,洋洋灑灑近50行,完全不符合極限編程的規矩。

在實現delegate方法中,有一個很重要的輔助函數叫closest,雖然現在它歸類為遍歷節點這個模塊中。這個函數實現得非常復雜,洋洋灑灑近50行,完全不符合極限編程的規矩。

  1. closest: function( selectors, context ) {     
  2.     var ret = [], i, l, cur = this[0];    
  3.     // Array    
  4.     if ( jQuery.isArray( selectors ) ) {//這分支的過濾邏輯基本與下面的一致  
  5.         var match, selector,  
  6.             matches = {},    
  7.             level = 1;    
  8.         if ( cur && selectors.length ) {    
  9.             for ( i = 0, l = selectors.length; i < l; i++ ) {    
  10.                 selector = selectors[i];    
  11.                 if ( !matches[ selector ] ) {    
  12.                     matches[ selector ] = POS.test( selector ) ?    
  13.                         jQuery( selector, context || this.context ) :    
  14.                       selector;    
  15.                 }    
  16.             }    
  17.             while ( cur && cur.ownerDocument && cur !== context ) {  
  18.                 for ( selector in matches ) {    
  19.                     match = matches[ selector ];//這里頻繁創建新的jQuery對象與使用is這樣復雜的方法,我不覺得其高效到哪里去    
  20.                     if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {    
  21.                         ret.push({ selector: selector, elem: cur, level: level });    
  22.                     }    
  23.                 }    
  24.                 cur = cur.parentNode;    
  25.                 level++;    
  26.             }    
  27.         }    
  28.         return ret;    
  29.     }  
  30.     // String     
  31.     var pos = POS.test( selectors ) || typeof selectors !== "string" ?    
  32.             jQuery( selectors, context || this.context ) :    
  33.             0;    
  34.     for ( i = 0, l = this.length; i < l; i++ ) {    
  35.         cur = this[i];    
  36.         while ( cur ) {    
  37.             if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {    
  38.                 ret.push( cur );    
  39.                 break;  
  40.             } else {    
  41.                 cur = cur.parentNode;    
  42.                 if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {    
  43.                    break;    
  44.                 }    
  45.             }    
  46.         }     
  47.     }  
  48.     ret = ret.length > 1 ? jQuery.unique( ret ) : ret;    
  49.     return this.pushStack( ret, "closest", selectors );    
  50. },   

恰逢我也想造個輪子,便去研究它一翻,發現其***個可以是字符串,元素節點或jQuery對象,還有一個可選參數,上下文??丛创a前幾句,發現有個分支是判斷是否是Array,估計是供內部調用的優化代碼,可以無視之。于是其方法簡化為:

  1. closest: function( selectors, context ) {    
  2.     var ret = [], i, l, cur = this[0];    
  3.     // 如果字符串包含位置偽類或者是個元素節點,則封裝為一個jQuery對象,否則為0(即false的簡寫,用于快速跳過分支)    
  4.     var pos = POS.test( selectors ) || typeof selectors !== "string" ?    
  5.         jQuery( selectors, context || this.context ) :    
  6.         0;    
  7.     //遍歷原jQuery對象的節點    
  8.     for ( i = 0, l = this.length; i < l; i++ ) {    
  9.         cur = this[i];    
  10.         while ( cur ) {    
  11.             //如果是jQuery對象,則判定其是否包含當前節點,否則使用matchesSelector方法判定這個節點是否匹配給定的表達式selectors    
  12.             if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {    
  13.               //是則放入選擇器中    
  14.                 ret.push( cur );    
  15.                 break;   
  16.             } else {    
  17.                 //  否則把當前節點變為其父節點    
  18.                 cur = cur.parentNode;    
  19.                 if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {    
  20.                     break;    
  21.                 }    
  22.             }    
  23.         }    
  24.     }    
  25.     //如果大于1,進行唯一化操作    
  26.     ret = ret.length > 1 ? jQuery.unique( ret ) : ret;    
  27.     //將節點集合重新包裝成一個新jQuery對象返回    
  28.     return this.pushStack( ret, "closest", selectors );    
  29. },  

由于本人很反感位置偽類,認為其違反選擇器的法則之一(由關系選擇器隔開的各選擇器分組內部,它們的位置是隨意的),因此有關位置偽類的邏輯我也去掉了。

  1. closest: function( selectors ) {    
  2.     var ret = [], i, l, cur = this[0];    
  3.     // 如果字符串包含位置偽類或者是個元素節點,則封裝為一個jQuery對象,否則為0(即false的簡寫,用于快速跳過分支)    
  4.     var node =  selectors.nodeType ? selectors :false;    
  5.     var nodes = [].slice.call(this);//將jQuery對象轉換為純數組    
  6.     //遍歷原jQuery對象的節點    
  7.     for ( i = 0, l = this.length; i < l; i++ ) {    
  8.         cur = this[i];   
  9.         while ( cur ) {    
  10.             //如果是jQuery對象,則判定其是否包含當前節點,否則使用matchesSelector方法判定這個節點是否匹配給定的表達式selectors    
  11.             if ( obj ? nodes.indexOf(node) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {    
  12.                 //indexOf方法在某些瀏覽器需要自行實現    
  13.                 //是則放入選擇器中    
  14.                 ret.push( cur );    
  15.                 break;    
  16.             } else {    
  17.                 //  否則把當前節點變為其父節點    
  18.                 cur = cur.parentNode;    
  19.                 //如果沒有父節點(說明其還沒有插入DOM樹),或不是元素節點,或是文檔碎片(說明其剛被移出DOM樹)    
  20.                 if ( !cur || !cur.ownerDocument || cur.nodeType === 11 ) {    
  21.                     break;    
  22.                 }    
  23.             }    
  24.         }    
  25.     }    
  26.     //如果大于1,進行唯一化操作    
  27.     ret = ret.length > 1 ? jQuery.unique( ret ) : ret;    
  28.     //將節點集合重新包裝成一個新jQuery對象返回    
  29.     return $(ret);//本人覺得pushStack真是個邪惡的方法,讓菜鳥不籽有鏈下去的欲望,殊不知這是維護的大敵    
  30. },  

注意,jquery1.6中closest方法不再是返回包含一個或零個節點的jQuery對象了,再是對應多個了(因此jQuery官網文檔是錯誤的,沒有即時同步這變化.)

  1. <!doctype html>    
  2.  
  3. <html>    
  4.   <head>    
  5.     <title>closest在jquery1.6的改變 by 司徒正美</title>    
  6.     <script src="jquery.js"></script>    
  7.     <script>    
  8.       $(function(){    
  9.         $("p").delegate("strong","click",function(){    
  10.          alert(this.innerHTML)    
  11.         });    
  12.         alert($("strong").closest("p").length)    
  13.       });    
  14.     </script>    
  15.   </head>    
  16.   <body>    
  17.     <p>    
  18.       <strong>使用事件代理1</strong>    
  19.     </p>    
  20.     <p>    
  21.      <strong>使用事件代理2</strong>    
  22.     </p>    
  23.     <p>    
  24.       <strong>使用事件代理3</strong>    
  25.     </p>    
  26.   </body>    
  27. </html>  

下面是我的實現:

  1. closest: function( expr ) {    
  2.     // 如果字符串包含位置偽類或者是個元素節點,則封裝為一個dom對象,否則為0(即false的簡寫,用于快速跳過分支)    
  3.     var node =  expr.nodeType ? expr : 0, nodes = dom.slice(this);//將它轉換為純數組    
  4.     //遍歷原dom對象的節點    
  5.     for (var i = 0, ret = [], cur; cur = this[i++];) {//由于肯定里面都是節點,因此可以使用這種循環    
  6.         while (cur && cur.nodeType === 1 ) {    
  7.             //如果是dom對象,則判定其是否包含當前節點,否則使用matchesSelector方法判定這個節點是否匹配給定的表達式expr    
  8.             if ( node ? nodes.indexOf(node) > -1 : matchElement( cur, expr ) ){    
  9.                 //indexOf方法在某些瀏覽器需要自行實現    
  10.                 //是則放入選擇器中    
  11.                 ret.push( cur );    
  12.                 break;    
  13.             } else {    
  14.                 // 否則把當前節點變為其父節點    
  15.                 cur = cur.parentNode;    
  16.             }    
  17.         }    
  18.     }    
  19.     //如果大于1,進行唯一化操作    
  20.     ret = ret.length > 1 ? dom.unique( ret ) : ret;    
  21.     //將節點集合重新包裝成一個新dom對象返回    
  22.     return this.labor(ret);    
  23. },  

原文鏈接:http://www.cnblogs.com/rubylouvre/archive/2011/05/12/2043854.html

【編輯推薦】

  1. 詳解jQuery構造器的實現
  2. jQuery調用WCF開發實例經驗分享
  3. 5月***超有趣的免費jQuery插件推薦
  4. 手把手教你使用jQuery操作元素的屬性與樣式
  5. jQuery性能指標和調優

 

責任編輯:陳貽新 來源: 司徒正美的博客
相關推薦

2011-01-24 13:20:49

2021-10-20 12:30:09

AIOps智能建筑物聯網

2015-07-16 14:40:20

簡化切換框架

2017-04-19 08:47:42

AsyncJavascript異步代碼

2024-12-31 00:07:12

2019-08-15 09:53:28

Windows 10啟動速度Windows

2021-08-03 06:57:36

Js事件節流

2023-04-17 10:10:42

2019-04-10 10:42:52

簡化Windows 10遷移

2023-08-11 17:19:03

2009-12-04 17:16:41

PHP析構函數

2023-04-28 14:52:26

2021-09-07 08:33:27

JavaScript TypeScript 函數

2020-03-26 07:49:13

智慧城市物聯網技術

2013-04-19 10:28:10

紅帽

2012-02-01 10:33:59

Java

2011-08-03 09:55:30

WindowsPowe組策略

2024-04-11 14:04:23

C++編程函數

2017-02-13 21:30:25

數據中心安全保護異構性

2013-03-20 10:43:15

HttpHandlerHttpModule
點贊
收藏

51CTO技術棧公眾號

欧美日韩国产首页| 国产成人免费视频网站| 亚洲精品国产精品乱码不99按摩 | 国产在线视频精品一区| 久久久精品一区二区| 久久发布国产伦子伦精品| 黑人极品ⅴideos精品欧美棵| 成人免费看的视频| 日本伊人精品一区二区三区介绍| 免费看91的网站| 中文幕av一区二区三区佐山爱| 亚洲人亚洲人成电影网站色| 国产区一区二区三区| 亚洲精品国产无码| 午夜精品国产| 亚洲美女在线看| 中文字幕一区久久| 2018av在线| 国产精品乱子久久久久| 成人在线观看av| 黄色一级视频免费看| 亚洲综合色站| 亚洲欧美日韩区| 下面一进一出好爽视频| 成人黄色免费短视频| 一区二区三区中文在线观看| 久热国产精品视频一区二区三区| 国产精品久久影视| 香蕉久久夜色精品| 欧美老女人在线视频| 一级片手机在线观看| 日韩精品久久久久久久软件91| 精品日韩美女的视频高清| 欧美亚洲免费在线| 亚洲精品97久久中文字幕| 日韩成人dvd| 久久久免费观看视频| 亚洲视频重口味| 日日天天久久| 日韩欧美黄色影院| 五月花丁香婷婷| 日韩在线伦理| 亚洲综合999| 一级一片免费播放| 国产精品麻豆一区二区三区 | 亚洲丝袜另类动漫二区| 欧美xxxx黑人又粗又长密月| 韩国av免费在线观看| 精品一区二区三区视频在线观看 | 狠狠色综合网| 久久精品亚洲一区| 久久精品国产亚洲AV成人婷婷| 久久精品亚洲成在人线av网址| 91精品国产色综合久久ai换脸 | aaa大片在线观看| 国产精品乱码妇女bbbb| 五月婷婷综合色| 黄色av免费在线看| 久久理论电影网| 国产伦一区二区三区色一情| а√中文在线资源库| 极品美女销魂一区二区三区| 国产精品一二三在线| 五月婷婷六月婷婷| 久久亚洲欧洲| 国产99久久精品一区二区永久免费 | 91一区一区三区| 国产九色91| 免费成人在线看| 成人听书哪个软件好| 动漫精品视频| 亚洲免费黄色片| 成人毛片在线观看| 狠狠色综合欧美激情| 日韩中文字幕综合| 暴力调教一区二区三区| 九九九九精品| 日夜干在线视频| 久久一区二区三区国产精品| 美脚丝袜一区二区三区在线观看| 日本ー区在线视频| 欧美极品美女视频| 永久久久久久| 欧美黑人猛交的在线视频| 亚洲国产精品久久人人爱 | 91在线品视觉盛宴免费| 国产精品久久久久久久蜜臀| 伊人久久青草| 国产亚av手机在线观看| 粉嫩老牛aⅴ一区二区三区| 无码人妻丰满熟妇区毛片18| 色综合天天色| 在线成人午夜影院| zjzjzjzjzj亚洲女人| 日韩av影院| 永久免费看mv网站入口亚洲| 情侣偷拍对白清晰饥渴难耐| 好看的日韩av电影| 欧洲一区二区视频| 一级片aaaa| 国产成人aaa| 蜜桃导航-精品导航| 色多多视频在线观看| 亚洲一区二区在线视频| 丝袜老师办公室里做好紧好爽| 国产一区二区精品调教| 日韩欧美三级在线| 国产精品扒开腿做爽爽| 91精品啪在线观看国产81旧版| 久久久综合免费视频| 天堂网一区二区| 国产高清视频一区| 日本在线免费观看一区| a视频在线观看| 欧美日韩一区二区精品| 欧美xxxxxbbbbb| 无码少妇一区二区三区| 久久久精品影院| 国产欧美一区二区三区在线看蜜臂 | 色噜噜狠狠狠综合曰曰曰88av| 久一区二区三区| 爽爽淫人综合网网站| 操一操视频一区| 国产精品一二三区视频| 亚洲a一区二区| 中文字幕亚洲欧洲| 亚洲精品无吗| 色综合色综合网色综合| 亚洲视频一区二区三区四区| 91原创在线视频| 国产亚洲精品久久久久久久| 精品肉辣文txt下载| 亚洲精品国产福利| 日本老熟俱乐部h0930| 男人的j进女人的j一区| 韩国一区二区三区美女美女秀| 日本成人网址| 日本乱人伦aⅴ精品| 日本精品一区二区三区在线播放视频| 欧美成人蜜桃| 337p日本欧洲亚洲大胆鲁鲁| 婷婷综合久久一区二区三区| 美女被艹视频网站| 三级电影一区| 国产精品com| 五月婷婷丁香花| 国产精品久久久久久久妇| 国产一区二区h| 日韩一区不卡| 午夜伦理福利在线| 亚洲电影免费观看高清| 成人免费毛片东京热| 久久se精品一区精品二区| 日韩视频免费大全中文字幕| 高清视频一区二区三区| 精品人妻一区二区三区四区不卡 | 亚洲欧美激情一区| 日韩精品一区三区| 成人福利视频网站| 日本黄色片一级片| 色播一区二区| 欧美成人免费一级人片100| 国产又粗又猛视频| 国产欧美日本一区二区三区| 99久久激情视频| 最新国产一区| 国产91色在线|免| 麻豆影视在线| 在线视频国内一区二区| 少妇太紧太爽又黄又硬又爽小说| 欧美aaaaaa午夜精品| 亚洲精品中字| 4438五月综合| 九九热视频这里只有精品| 亚洲国产999| 亚洲成a人v欧美综合天堂| 国产一级二级视频| 性娇小13――14欧美| 日韩国产欧美一区| 欧美风情在线视频| 欧美成人中文字幕| 日韩一区二区三区在线观看视频| 五月激情丁香一区二区三区| 亚洲一区二区三区黄色| 奶水喷射视频一区| 亚洲一区二区在线免费观看| 欧美一区在线观看视频| 久久久亚洲精选| 日本不卡视频一区二区| 欧美日韩精品三区| 国产乡下妇女做爰| 中文字幕欧美区| 日韩av影视大全| 99国产成+人+综合+亚洲欧美| 欧美第一黄网| 欧美成人三级| 97国产一区二区精品久久呦| 日本中文字幕电影在线观看| 欧美日韩精品高清| 国产真实的和子乱拍在线观看| 26uuu亚洲综合色欧美 | 久久精品国产一区二区| 免费高清一区二区三区| 国产亚洲一区| 91情侣偷在线精品国产| 日本在线高清| 日韩在线观看免费高清完整版| 亚洲第一成人av| 色悠悠久久综合| 日韩女优一区二区| 国产日本欧美一区二区| 无码国产精品一区二区高潮| 麻豆精品网站| 成人在线观看毛片| 欧美丝袜激情| 国产一区二区三区高清视频| 国产一区二区三区四区五区3d| 久久久久久久国产精品| 91xxx在线观看| 亚洲国产一区二区三区四区| 91麻豆视频在线观看| 欧美性极品少妇精品网站| 男人在线观看视频| 国产欧美日韩在线观看| 中文字幕a在线观看| 国内精品国产成人| 国产精品天天av精麻传媒| 亚洲精选在线| 四虎精品欧美一区二区免费| 成人精品中文字幕| 免费成人看片网址| 极品国产人妖chinesets亚洲人妖| 成人黄色片在线| 欧美成人ⅴideosxxxxx| 国模私拍视频一区| 91麻豆免费在线视频| 综合欧美国产视频二区| 男人天堂资源在线| 亚洲国产精品99| 午夜精品视频网站| 精品国产视频在线观看| 99精品国产热久久91蜜凸| 一级淫片在线观看| 日本vs亚洲vs韩国一区三区二区| 天天夜碰日日摸日日澡性色av| 欧美电影一区| 日韩欧美国产二区| 亚洲深夜福利在线观看| 国产欧美一区二区在线播放| 天堂精品在线视频| 91免费精品视频| 精品久久福利| 国产精品久久久av| 欧亚一区二区| 热99在线视频| 亚洲女同av| 欧美制服第一页| 亚洲精品日产| 欧美诱惑福利视频| 国产高清不卡| 欧美专区在线播放| 最新欧美色图| 欧美专区福利在线| 国模一区二区| 国产精品久久久久久久久久久久久久 | 日韩a在线播放| 一区二区视频欧美| 国产一区二区四区| 亚洲人人精品| 久久精品国产sm调教网站演员| 国自产拍偷拍福利精品免费一| 欧美少妇在线观看| 影音国产精品| 欧美 日韩 国产 高清| 小嫩嫩精品导航| youjizzxxxx18| 久久99国产精品成人| 欧美性受xxxx黒人xyx性爽| 国产成人高清视频| 国产美女视频免费观看下载软件| 97国产精品videossex| 免费看污片网站| 国产精品国产自产拍高清av | 久久悠悠精品综合网| 好吊色欧美一区二区三区| 蜜桃a∨噜噜一区二区三区| 日韩在线第一区| 香蕉视频国产精品| 日韩人妻无码精品久久久不卡| 国产欧美一级| 午夜两性免费视频| 国产精品资源网站| 亚洲av无码一区二区三区网址| 国产亚洲午夜高清国产拍精品| 五月天婷婷丁香网| 亚洲制服丝袜av| chinese国产精品| 欧美老女人第四色| 涩涩视频免费看| 尤物精品国产第一福利三区| 黄色网页在线免费看| 97精品一区二区视频在线观看| 黄色亚洲网站| 亚洲一区美女视频在线观看免费| 精品久久ai电影| 亚洲精品人成| 黄色免费成人| 国产又大又黄又粗又爽| 国产不卡视频一区| 精品无码在线观看| 亚洲一区免费视频| 中文字幕视频一区二区| 欧美mv和日韩mv国产网站| 黄色片视频在线观看| 久久91亚洲人成电影网站| 伊人久久视频| 91久久精品www人人做人人爽| 免费精品国产| 日韩欧美猛交xxxxx无码| 日本不卡高清视频| 国产一级免费片| 一区在线观看视频| 精品不卡一区二区| 欧美白人最猛性xxxxx69交| shkd中文字幕久久在线观看| 91国产高清在线| 99国内精品久久久久| 欧美一区二区在线| 亚洲日本激情| 色黄视频免费看| 中文字幕免费不卡| www.国产com| 日韩女同互慰一区二区| 69久久夜色| 奇米影视亚洲狠狠色| 国产精品2023| 国产一二三四区在线观看| 青青草视频一区| av直播在线观看| 亚洲成人福利片| 国产丝袜视频在线观看| 色系列之999| 日本成人伦理电影| 久久久精品国产一区二区三区| 欧美日本一区二区视频在线观看 | av在线中出| 成人动漫在线视频| 亚洲综合五月| 午夜不卡福利视频| 亚洲三级免费电影| 国产麻豆精品一区| 日韩在线观看免费| 亚洲伊人伊成久久人综合网| 亚洲精品一卡二卡三卡四卡| 天堂在线亚洲视频| 国产成人av一区二区三区不卡| 精品国产鲁一鲁一区二区张丽| 黄色小视频免费在线观看| 欧美国产乱视频| 亚洲超碰在线观看| 欧美一级中文字幕| 高清成人在线观看| 国产亚洲精品久久久久久无几年桃| 欧美一区二区在线视频| 成人av福利| 亚洲一区二区三区乱码aⅴ蜜桃女| 色综合久久一区二区三区| 国产色视频在线播放| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 白白色亚洲国产精品| 午夜毛片在线观看| 亚洲国产精品va在线看黑人动漫| 91黄页在线观看| 精品国产乱码久久久久久蜜柚| 国产亚洲精品bv在线观看| 熟妇高潮精品一区二区三区| 色综合久久中文综合久久97| 激情图片中文字幕| 在线日韩一区| 国产在线观看福利| 欧美极品xxx| 一级黄色录像大片| 欧美日韩国产成人在线观看| 波多野结衣在线一区二区| 中文字幕无码精品亚洲35| 91麻豆swag| 中文字幕av影视| 久久综合久中文字幕青草| 成人三级毛片| 日韩欧美在线播放视频| 国产精品国产三级国产| 亚洲第一精品网站| 青青草精品毛片| 日韩精品网站| 日本成人在线免费| 欧美性videos高清精品| 在线视频91p| av噜噜色噜噜久久| 日韩在线一区二区三区| 日韩欧美综合视频|