詳解jQuery中的getAll和cleanData()
前言:
看 jQuery 源碼的一個痛點就是調用一個函數時,里面會調用 N 個其他函數 , 然后這 N 個函數里面又會調用 M 個其他其他函數 。。
本篇文章主要是對detach()/empty()/remove()/unwrap()]() 中兩個函數 getAll和cleanData() 進行解析 。
一、getAll(context, tag)
作用:
用來獲取 context 上的 tag 標簽,或者是將 context 和 context 里的 tag 標簽的元素合并
源碼:

注意:DocumentFragment 沒有getElementsByTagName方法,但有querySelectorAll方法!
二、$.merge()
作用:
合并兩個數組內容到第一個數組
源碼:

需要注意的是最后的 first.length = i
三、cleanData()
作用:
【詳解jQuery中的getAll和cleanData()】清除元素節點上的事件和數據
源碼:

解析:
① 依次判斷 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
源碼:

注意:
Object 類型的 nodeType 是 undefined
五、$.removeEvent()
作用:
移除 elem 上的自定義監聽事件
源碼:

本質即調用原生JS的removeEventListener()方法
總結
以上所述是小編給大家介紹的jQuery中的getAll()和cleanData(),希望對大家有所幫助 。
