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

首頁 > 編程 > JavaScript > 正文

詳解jQuery中的getAll()和cleanData()

2019-11-19 11:46:53
字體:
來源:轉載
供稿:網友

前言:

看 jQuery 源碼的一個痛點就是調用一個函數時,里面會調用 N 個其他函數,然后這 N 個函數里面又會調用 M 個其他其他函數。。

本篇文章主要是對detach()/empty()/remove()/unwrap()]() 中兩個函數 getAll和cleanData() 進行解析。

一、getAll(context, tag)

作用:

用來獲取 context 上的 tag 標簽,或者是將 context 和 context 里的 tag 標簽的元素合并

源碼:

//一般是傳的node,'script' //應該是用來獲取context上的tag標簽,或者是將context和context里的tag標簽的元素合并 //源碼4893行 function getAll( context, tag ) {  // Support: IE <=9 - 11 only  // Use typeof to avoid zero-argument method invocation on host objects (#15151)  var ret;  console.log(context,typeof context.getElementsByTagName,typeof context.querySelectorAll,'context4894')  //如果context存在getElementsByTagName的方法的話  if ( typeof context.getElementsByTagName !== "undefined" ) {   //tag:script   //從context中獲取script標簽的節點   ret = context.getElementsByTagName( tag || "*" )   console.log(tag,ret,'ret4897')  } //DocumentFragment沒有getElementsByTagName方法,但有querySelectorAll方法 else if ( typeof context.querySelectorAll !== "undefined" ) {   ret = context.querySelectorAll( tag || "*" );  } else {   ret = [];  }  console.log(nodeName( context, tag ),'nodeName4909')  //nodeName() 判斷兩個參數的nodename是否相等  if ( tag === undefined || tag && nodeName( context, tag ) ) {   return jQuery.merge( [ context ], ret );  }  return ret; }

注意:DocumentFragment 沒有getElementsByTagName方法,但有querySelectorAll方法!

二、$.merge()

作用:

合并兩個數組內容到第一個數組

源碼:

 // Support: Android <=4.0 only, PhantomJS 1 only  // push.apply(_, arraylike) throws on ancient WebKit  //源碼461行  //將second合并到first后面  merge: function( first, second ) {   var len = +second.length,    j = 0,    i = first.length;   //依次將second的item添加到first后面   for ( ; j < len; j++ ) {    first[ i++ ] = second[ j ];   }   //first可能是類數組,所以需要更新下length屬性   first.length = i;   return first;  },

需要注意的是最后的 first.length = i

三、cleanData()

作用:

清除元素節點上的事件和數據

源碼:

 //清除elems上的數據和事件  //源碼6146行  cleanData: function( elems ) {   var data, elem, type,    //beforeunload/blur/click/focus/focusin/focusout/    //load/mouseenter/mouseleave/pointerenter/pointerleave    special = jQuery.event.special,    i = 0;   for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {    //允許的節點類型    if ( acceptData( elem ) ) {     //當有事件綁定到elem后,jQuery會給elem一個屬性dataPriv.expando     //該屬性上面就綁定了事件和數據     if ( ( data = elem[ dataPriv.expando ] ) ) {      //如果data上有事件的話      if ( data.events ) {       //逐個列舉data上的事件,比如click       for ( type in data.events ) {        // 如果special中有data.events上的事件        if ( special[ type ] ) {         //調用jQuery.event.remove方法,移除elem上的event類型         jQuery.event.remove( elem, type );         // This is a shortcut to avoid jQuery.event.remove's overhead        }        //應該是自定義的事件        else {         //本質即elem.removeEventListener(type,handle)         jQuery.removeEvent( elem, type, data.handle );        }       }      }      // Support: Chrome <=35 - 45+      // Assign undefined instead of using delete, see Data#remove      //最后將元素的dataPriv.expando屬性置為undefined      elem[ dataPriv.expando ] = undefined;     }     //dataUser應該是用戶綁定的事件     if ( elem[ dataUser.expando ] ) {      // 將元素的dataUser.expando屬性置為undefined      // Support: Chrome <=35 - 45+      // Assign undefined instead of using delete, see Data#remove      elem[ dataUser.expando ] = undefined;     }    }   }  }

解析:

① 依次判斷 elems[i] 是否是元素節點/文檔節點/對象

② 再判斷 elem 的 dataPriv.expando 屬性是否有 events 屬性

③ 當 events 里有 jQuery.event.special 指定的 事件類型時,
使用jQuery.event.remove(elem,type)移除事件和數據

④ 反之,則使用jQuery.removeEvent(elem,type,data.handle)移除事件和數據

⑤ 將 elem[dataPriv.expando]置為 undefined

⑥ 將 elem[dataUser.expando]置為 undefined

四、acceptData()

作用:

判斷是否是指定的節點類型,返回 true/false

源碼:

 //判斷是否是指定的節點類型 //只接受元素節點1,文檔節點9,任意對象 //返回true/false //源碼4178行 var acceptData = function( owner ) {  // Accepts only:  // - Node  //  - Node.ELEMENT_NODE  //  - Node.DOCUMENT_NODE  // - Object  //  - Any  return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); }

注意:

Object 類型的 nodeType 是 undefined

五、$.removeEvent()

作用:

移除 elem 上的自定義監聽事件

源碼:

 //移除elem上的自定義監聽事件 //源碼5599行 //jQuery.removeEvent(elem,type,data.handle) jQuery.removeEvent = function( elem, type, handle ) {  // This "if" is needed for plain objects  if ( elem.removeEventListener ) {   elem.removeEventListener( type, handle );  } }

本質即調用原生JS的removeEventListener()方法

總結

以上所述是小編給大家介紹的jQuery中的getAll()和cleanData(),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91色在线视频| 欧美成人精品一区| 日韩av不卡在线| 日韩在线播放av| 欧美精品久久久久久久| 日韩欧美精品网站| 最新69国产成人精品视频免费| 国产啪精品视频网站| 一区二区三区 在线观看视| 国产成人av网| 亚洲精品456在线播放狼人| 亚洲国产日韩欧美在线99| 国内精品久久久久影院优| 欧美影院久久久| 久久天堂电影网| 国产va免费精品高清在线| 国产欧美日韩最新| 国产成人精品免高潮在线观看| 久久91亚洲人成电影网站| 欧美大秀在线观看| 精品中文字幕在线| 日韩三级影视基地| 在线成人中文字幕| 亚洲第一av网站| 亚洲欧美另类自拍| 国产在线视频欧美| 国产精品av电影| 国产欧洲精品视频| 亚洲精品福利视频| 国产欧美一区二区三区在线| 国产精品日韩av| 欧美诱惑福利视频| 欧美成人第一页| 91高清视频免费| 日本亚洲精品在线观看| 日韩av片免费在线观看| 日韩av电影在线网| 亚洲一区av在线播放| 一个人看的www久久| 曰本色欧美视频在线| 午夜精品久久久久久久99热| 精品国产一区二区三区久久| 91精品国产九九九久久久亚洲| 中文在线资源观看视频网站免费不卡| 国产一区二区在线播放| 欧美一区在线直播| 日韩亚洲成人av在线| 97高清免费视频| 性金发美女69hd大尺寸| 欧美激情一区二区三区久久久| 国产亚洲精品久久久久久牛牛| 黄色成人在线播放| 在线成人一区二区| 中文字幕视频在线免费欧美日韩综合在线看| 日本精品久久电影| 亚洲欧美国产一本综合首页| 成人信息集中地欧美| 91免费人成网站在线观看18| 国产欧美日韩精品专区| 日韩不卡中文字幕| 成人在线观看视频网站| 欧美性猛交xxxx免费看漫画| 中文字幕久久精品| 欧美大成色www永久网站婷| 欧美日韩一区免费| 黑人巨大精品欧美一区二区| 亚洲人成欧美中文字幕| 亚洲天堂网站在线观看视频| 亚洲欧美成人一区二区在线电影| 亚洲一区中文字幕| 国产性猛交xxxx免费看久久| 色综久久综合桃花网| 欧美日韩激情美女| 亚洲一区二区三区在线免费观看| 精品亚洲一区二区三区在线观看| 992tv在线成人免费观看| 热久久这里只有精品| 91久久久久久| 国产激情综合五月久久| 成人午夜高潮视频| 亚洲www在线| 日韩精品高清视频| 国产亚洲免费的视频看| 91精品国产99| 国产做受高潮69| 久久亚洲精品中文字幕冲田杏梨| 中文字幕亚洲色图| 亚洲黄色在线观看| 欧美色播在线播放| 欧美亚洲视频在线看网址| 国产精品成人一区二区三区吃奶| 亚洲欧美综合区自拍另类| 亚洲最新在线视频| 日本久久精品视频| 狠狠色狠狠色综合日日五| 日韩电影视频免费| 国产成人精品久久二区二区91| 91日韩在线视频| 国产精品久久久| 国产精品久久久久久亚洲影视| 亚洲精选在线观看| 国产a∨精品一区二区三区不卡| 九九久久国产精品| 久久视频中文字幕| 日韩国产精品亚洲а∨天堂免| 日韩美女视频在线观看| 久久影视电视剧免费网站| 成人免费网视频| 色噜噜狠狠色综合网图区| 九九热这里只有精品免费看| 欧美与欧洲交xxxx免费观看| 人九九综合九九宗合| 国产在线观看91精品一区| 亚洲黄色在线观看| 91免费欧美精品| 欧美精品日韩三级| 国产精品久久国产精品99gif| 精品偷拍各种wc美女嘘嘘| 日韩电影中文字幕一区| 日韩最新在线视频| 最新国产成人av网站网址麻豆| 国产精品视频免费观看www| 欧美午夜无遮挡| 人九九综合九九宗合| 精品国产美女在线| 亚洲自拍中文字幕| 久久九九国产精品怡红院| 亚洲国内精品视频| 亚洲小视频在线观看| 国产网站欧美日韩免费精品在线观看| 日韩精品在线观看视频| 97在线看福利| 欧美高清不卡在线| 久久视频在线视频| 国产一区红桃视频| 亚洲欧美精品一区| 亚洲性夜色噜噜噜7777| 中文字幕9999| 欧美综合在线第二页| 中文字幕久热精品视频在线| 精品久久久久久国产| 国产精品一二区| 96sao精品视频在线观看| 91精品国产高清自在线| 欧美亚洲国产精品| 欧美网站在线观看| 亚洲小视频在线| 色综合久久中文字幕综合网小说| 日韩中文字幕在线视频播放| 国产噜噜噜噜噜久久久久久久久| 亚洲夜晚福利在线观看| 久久精品欧美视频| 午夜精品视频在线| 成人综合国产精品| 亚洲乱码av中文一区二区| 国产99久久久欧美黑人| 中文字幕精品在线| 精品亚洲va在线va天堂资源站| 亚洲第一网中文字幕| 中文字幕亚洲综合久久| 色与欲影视天天看综合网| 91av网站在线播放| 狠狠躁夜夜躁人人躁婷婷91| 亚洲夜晚福利在线观看|