精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

caoporn91| 久久乐国产精品| 性欧美精品一区二区三区在线播放| 精品深夜av无码一区二区老年| 99这里只有精品视频| 亚洲成av人片www| 欧美日韩一区二区三| 伊人精品一区二区三区| 欧美激情自拍| 亚洲欧洲偷拍精品| www.色.com| 欧美三级精品| 亚洲一区电影777| 日韩精品欧美在线| 国产一级在线播放| 嫩草一区二区三区| 日韩精品综合一本久道在线视频| 精品一区二区中文字幕| 国产精品剧情| 久久精品人人爽人人爽| 97人摸人人澡人人人超一碰| 无码人妻av免费一区二区三区 | 欧美久久婷婷综合色| 欧美美女黄色网| 95在线视频| 26uuu亚洲综合色| 北条麻妃99精品青青久久| 年下总裁被打光屁股sp| 激情成人四房播| 91毛片在线观看| 99一区二区| 欧美国产在线看| 欧美亚洲激情| 亚洲美女性视频| 亚洲天堂av网站| 成人在线视频www| 欧美专区在线观看一区| 日韩福利视频| 日韩永久免费视频| 国产在线不卡一区| 国产精品久久久久久久电影| 久久精品欧美一区二区| 久久久久久久久99精品大| 国产亚洲福利一区| 欧美婷婷精品激情| 亚洲国产成人二区| 欧美日韩国产黄| 青青草成人免费在线视频| 在线观看a级片| 中文字幕一区在线| 亚洲欧洲精品在线| av在线免费一区| 中文字幕精品一区| 日韩中文不卡| 国产视频网站在线| 久久精品国产第一区二区三区| 欧美中文字幕视频在线观看| 国产精品成人aaaa在线| 韩国精品一区二区三区| 欧美福利小视频| 久久精品这里只有精品| 中文字幕亚洲精品乱码| 精品免费视频一区二区| 女王人厕视频2ⅴk| 日韩成人精品| 精品美女在线播放| 一边摸一边做爽的视频17国产| 亚洲一区二区三区四区电影| 精品久久久国产精品999| 免费网站永久免费观看| 天天色天天射天天综合网| 一区二区激情小说| 加勒比成人在线| 91www在线| 色综合久久综合网| 精品久久免费观看| 91高清在线观看视频| 亚洲一区二区在线免费观看视频| 天堂av在线中文| 丁香花在线电影| 亚洲国产精品av| 婷婷五月色综合| 激情成人四房播| 亚洲www啪成人一区二区麻豆| 男人操女人逼免费视频| 一区二区视频免费完整版观看| 欧美午夜不卡在线观看免费| 182午夜视频| 欧美人与性动交xxⅹxx| 欧美在线观看视频在线| 国产精品久久久久久久99| h视频久久久| 亚洲欧美第一页| 91精品少妇一区二区三区蜜桃臀| 黄色精品网站| 国产精品第一视频| 超碰在线观看99| 久久先锋影音av| 久久天天东北熟女毛茸茸| 国产乱码精品一区二三赶尸艳谈| 91久久一区二区| 国产又粗又猛又爽又黄| 开心久久婷婷综合中文字幕| 日韩一区二区三区四区五区六区| 日韩成人av一区二区| 久久一区91| 2019日本中文字幕| 亚洲在线精品视频| 99re这里只有精品首页| 正在播放久久| 成人va天堂| 精品少妇一区二区| 免费看一级黄色| 国语产色综合| 欧美激情国产精品| 亚洲精品国产欧美在线观看| 成人av在线播放网站| 亚洲精品高清视频| 亚洲人成在线网站| 日韩一区二区影院| 激情无码人妻又粗又大| 亚洲欧美视频| 国产精品一 二 三| 黄色国产网站在线播放| 日本韩国精品在线| 波多野结衣视频播放| 欧美国产三级| 欧美高清视频一区二区| 中文字幕久久网| 久久人人97超碰com| 阿v天堂2018| 日韩一二三区在线观看| 日韩中文综合网| 亚洲av无码不卡| 99国产精品国产精品久久| 日韩在线观看a| 青草伊人久久| 欧美老少做受xxxx高潮| 国产原创中文av| 国产精品久久久久久一区二区三区| 丝袜老师办公室里做好紧好爽| 福利片在线一区二区| 久久69精品久久久久久久电影好| 91成年人视频| 欧美国产精品一区二区| 美女网站免费观看视频| 国产一区二区精品久| 91高潮在线观看| 手机福利在线| 国产精品婷婷午夜在线观看| 东京热加勒比无码少妇| 亚洲区小说区| 日本久久久久久久久久久| 中文在线最新版天堂| 久久久www免费人成精品| 日韩偷拍一区二区| 亚洲高清黄色| 亚洲日韩欧美视频| 欧美超碰在线观看| 久久久www免费人成精品| 性生交免费视频| 久久亚洲精品中文字幕蜜潮电影| 国产日韩欧美综合| 网友自拍视频在线| 91精品国产综合久久小美女| 在线免费观看亚洲视频| 成人一区二区三区视频 | 国产白嫩美女无套久久| 国产一区二区精品| 欧美1o一11sex性hdhd| 国产另类xxxxhd高清| 少妇高潮久久77777| 精品少妇爆乳无码av无码专区| 风间由美性色一区二区三区| 男女猛烈激情xx00免费视频| 亚洲97av| 国产在线日韩在线| 视频在线观看入口黄最新永久免费国产| 日韩亚洲国产中文字幕欧美| 日本一二三区不卡| 久久久91精品国产一区二区精品 | 国产精品第一页在线观看| av中文字幕一区| 国产一级不卡毛片| 婷婷伊人综合| 久久99国产精品| 国产精品久久久久久久久免费高清| 久久久av一区| 视频在线不卡| 91精品视频网| 国内免费精品视频| 国产精品久久久久久亚洲毛片 | 91av视频在线观看| www.在线播放| 日韩欧美的一区| 中文在线第一页| 亚洲精品视频一区二区| 中文字幕xxx| 国产成人免费视| 国产理论在线播放| 精品91久久久久| 亚洲国产一区二区精品视频| 免费一区二区三区在线视频| 欧美亚洲第一页| 亚洲资源一区| 尤物精品国产第一福利三区| 好吊色视频一区二区| 欧美艳星brazzers| 日韩三级小视频| 中文字幕日韩av资源站| 欧美老熟妇乱大交xxxxx| 国产福利视频一区二区三区| 欧美日本视频在线观看| 亚洲天天影视网| 日本公妇乱淫免费视频一区三区| 91福利区在线观看| 日韩一区二区三区国产| 欧美理论在线观看| 精品国产乱码久久久久久久| 91尤物国产福利在线观看| 色诱亚洲精品久久久久久| 国产一级一片免费播放放a| 成人欧美一区二区三区视频网页| 成人免费看aa片| 成人一级视频在线观看| 超碰在线资源站| 轻轻草成人在线| 国产日产欧美视频| 国产美女诱惑一区二区| 丁香六月激情婷婷| 欧美精品18| 黄色a级在线观看| 久久久综合色| 天堂资源在线亚洲资源| av亚洲免费| 91沈先生在线观看| 久久久成人av毛片免费观看| www.色综合| porn亚洲| 国产一区二区三区久久精品| 免费一级毛片在线观看| 国产丝袜高跟一区| 五月婷婷六月激情| 亚洲国产精品久久久久秋霞蜜臀| 国产大片中文字幕| 亚洲免费在线视频| 欧美第一页在线观看| 国产精品成人免费| 成人三级视频在线观看| 中文一区二区完整视频在线观看| 中文字幕网站在线观看| 蜜臀久久久久久久| 中文字幕第80页| 免费在线视频一区| www.99r| 国模大尺度一区二区三区| 黄色永久免费网站| 久久精品国内一区二区三区| 爱豆国产剧免费观看大全剧苏畅| 九一久久久久久| 人人妻人人做人人爽| 亚洲午夜电影| 成人一对一视频| 欧美专区在线| 一区二区三区网址| 久久99久久久欧美国产| 色黄视频免费看| 成人高清免费观看| 亚洲一区二区三区蜜桃| 国产精品人人做人人爽人人添| 天堂网av2018| 亚洲综合色丁香婷婷六月图片| 日本五十熟hd丰满| 在线这里只有精品| 国产欧美一级片| 亚洲成人1234| 国产免费av在线| 欧美乱妇高清无乱码| 黄视频网站在线观看| 国产成人精品亚洲精品| 91精品一久久香蕉国产线看观看| 91丨九色丨国产| 校园春色另类视频| 亚洲在线色站| 99精品福利视频| 亚洲欧美日韩一级| 懂色av中文字幕一区二区三区| 内射中出日韩无国产剧情| 国产精品女同互慰在线看| 国产探花在线播放| 色香色香欲天天天影视综合网| 国产精品一级二级| 精品视频中文字幕| 国产欧美久久久久久久久| 91av在线网站| **国产精品| 欧美日韩天天操| 欧美aⅴ99久久黑人专区| 久久久久狠狠高潮亚洲精品| 国产另类ts人妖一区二区| 精品人妻一区二区三区香蕉| 亚洲天堂中文字幕| 国产三级精品三级在线观看| 日韩一二在线观看| se在线电影| 欧美中文在线观看国产| 一区二区日韩| 午夜精品亚洲一区二区三区嫩草 | 最新免费av网址| 久久综合九色综合97_久久久| 成人免费黄色小视频| 色婷婷综合久久久久中文| www.久久成人| 中文字幕在线精品| 欧美成人影院| 狠狠色噜噜狠狠色综合久| 亚洲**毛片| 日韩av一区二区三区美女毛片| 亚洲高清电影| 无套内谢丰满少妇中文字幕| 中文字幕+乱码+中文字幕一区| 丁香六月婷婷综合| 欧美精品一区二区不卡| 激情成人四房播| 国产日韩欧美电影在线观看| 国产伦精品一区二区三区视频| 成人在线观看你懂的| 岛国精品在线观看| 69av.com| 日韩午夜电影av| 黄色网页在线播放| 成人激情春色网| 99久久亚洲精品蜜臀| 五月婷婷狠狠操| 国产区在线观看成人精品| 一本色道久久88| 在线观看成人小视频| 欧美在线一卡| 欧美做爰性生交视频| 日韩欧美中文字幕电影| 亚洲中文字幕无码av永久| 国产成人亚洲综合a∨猫咪| 五月婷婷一区二区| 欧美xxxx老人做受| 色屁屁www国产馆在线观看| 91免费视频网站| 亚洲午夜精品一区 二区 三区| 91aaa精品| 亚洲综合男人的天堂| 丰满熟妇人妻中文字幕| 欧美精品久久久久久久久| 色多多在线观看| 国产专区一区二区| 在线日韩欧美| 三级黄色片网站| 欧美午夜精品久久久久久久| 久久电影中文字幕| 国产精品白丝jk喷水视频一区| 精品国产中文字幕第一页| 在线观看av日韩| 亚洲欧洲精品成人久久奇米网| 国产亲伦免费视频播放| 欧美激情图片区| 免费成人蒂法| 波多野结衣天堂| 亚洲色图另类专区| 亚洲经典一区二区| 91成人在线视频| 欧美日一区二区| 热久久久久久久久| 亚洲一区二区三区中文字幕| 亚洲欧美日韩精品永久在线| 国产精品第一页在线| 永久亚洲成a人片777777| 老熟女高潮一区二区三区| 午夜日韩在线电影| 国产福利免费在线观看| 亚洲www在线| 国产欧美午夜| 任你操精品视频| 欧美精品一区二区精品网| 电影亚洲精品噜噜在线观看| 最新黄色av网站| 91在线视频在线| 波多野结衣电车痴汉| 久久久av电影| 亚洲另类春色校园小说| 中文字幕第100页| 亚洲国产精品一区二区久久| 国际av在线| 99re在线观看| 日韩二区在线观看| 激情五月婷婷小说| 国产亚洲精品成人av久久ww| 91大神精品| 超碰超碰在线观看| 亚洲电影在线免费观看| 午夜激情视频在线| 欧美国产二区| 国产suv精品一区二区三区|