首頁  >  問答  >  主體

javascript - 關於jquery的remove()方法

#這裡不太明白,不會重jquery物件中刪除?如果要刪除,要怎麼刪除呢?

阿神阿神2663 天前1040

全部回覆(1)我來回復

  • 学习ing

    学习ing2017-07-05 11:08:29

    關於 remove 我們看源碼是這樣的:摘自jquery2.x

    // keepData is for internal use only--do not document
        remove: function( selector, keepData ) {
            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;
        },

    依照範例的程式碼 $('p').remove()結合原始碼所說,其實實用的就是原生的removeChild

    https://developer.mozilla.org...

    而removeChild 這裡MDN有個說明:

    被移除的這個子節點仍然存在於內存中,只是沒有添加到當前文檔的DOM樹中,因此,你還可以把這個節點重新添加回文檔中,當然,實現要用另外一個變量比如上例中的oldChild來保存這個節點的引用. 如果使用上述語法中的第二種方法, 即沒有使用oldChild 來保存對這個節點的引用, 則認為被移除的節點已經是無用的, 在短時間內將會被記憶體管理回收.

    而題主標註的 不會從jQuery物件中刪除,也一樣,題主可以在頁面隨便找一個jQuery dom看看,
    比如

    var t = $('#test');
    t.remove();

    這裡t就是一個jQuery對象,包含了已經remove掉的dom的資訊。

    正如上面引用mdn所說,如果你沒有用變數來保存已經刪除的dom,那它就等著被回收掉了。

    當然可能覺得就像上面,還是用了t保存了dom的信息,並且在t[0]上,那可以試下 delete(t[0]) ?

    = =我倒是 不知道咋測試那個dom到底被回收了沒。不過基本上remove了,也沒引用了 ,如果頁面dom不是很複雜的話,暫時可以忽略。 這是我的見解,有不對的請指教哈~

    回覆
    0
  • 取消回覆