涉及節點刪除的接口jQuery劃分了四個分別是detach,empty,remove,unwrap,因為使用的范圍不同,所以功能有所差異,但是總的來說都是用來清理節點的。
innerText是我們常用的文本清理方法,但是火狐下不兼容,不過會提供一個類似的方法叫textContent。
兩者還是有一些區別的,總結如下。
IE中的innerText是需要對innerHTML的值進行:
而FF中的textContent沒有2、3步,在經過了HTML轉義之后直接剔除所有html標簽后得到的純文本,我們在接著看下就jQuery對節點清除的具體封裝。
.empty()
從DOM中移除集合中匹配元素的所有子節點,為了避免內存泄漏,jQuery先移除子元素的數據和事件處理函數,然后移除子元素。
empty: function() { var elem, i = 0; for (; (elem = this[i]) != null; i++) { if (elem.nodeType === 1) { jQuery.cleanData(getAll(elem, false)); elem.textContent = ""; } } return this; }
jQuery是合集元素,所以我們遍歷下this[i],然后直接把元素的textContent清空即可,但是需要注意jQuery.cleanData方法,清除節點不單單只有元素,還有附加在上面的事件處理與數據緩存。
jQuery.cleanData方法,就是通過元素判斷上綁定的expando的這個uuid在與之對應的cache中找到數據與事件句柄加以刪除。
.remove()
.remove()
將元素移出DOM,當我們想將元素自身移除時我們用 .remove()
,同時也會移除元素內部的一切,包括綁定的事件及與該元素相關的jQuery數據。
remove: function(selector, keepData /* Internal Use Only */ ) { var elem, elems = selector ? jQuery.filter(selector, this) : this, i = 0; for (; (elem = elems[i]) != null; i++) { if (!keepData && elem.nodeType === 1) { jQuery.cleanData(getAll(elem)); } if (elem.parentNode) { if (keepData && jQuery.contains(elem.ownerDocument, elem)) { setGlobalEval(getAll(elem, "script")); } elem.parentNode.removeChild(elem); } } return this; }
remove是empty的加強版,把本身的父節點也清除掉了。因為remove支持過濾器所以支持傳遞selecor。remove需要刪除自身及其所有的子元素包括事件與數據,所以要通過找到父節點parnetNode移除。
.detach()
如果你想刪除元素,不破壞他們的數據或事件處理程序(這些綁定的信息還可以在之后被重新添加回來)。.detach() 方法和.remove()一樣, 除了 .detach()保存所有jQuery數據和被移走的元素相關聯。當需要移走一個元素,不久又將該元素插入DOM時,這種方法很有用。
detach: function(selector) { return this.remove(selector, true); }
這個方法也很簡單,意味著這要暫時移除節點,但是不銷毀對應的事件與數據,在remove方法中支持傳遞布爾值用來處理這個cleanData的過濾。
請驗證,完成請求
由于請求次數過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報