4

約 1,500 行を含むテーブルがあります。

次の jQuery コードを使用して、DOM からテーブルを削除しています。

$('#myTable').remove();

これには約 300 ミリ秒かかり、かなり顕著な遅延が生じます。

同じことを removeChild() で行う:

var myTable = $('#myTable')[0] ;
myTable.parentNode.removeChild(myTable);

約30msかかります。

私は removeChild() バージョンを簡単に使用できますが、なぜ jQuery の remove() がそれほど長くかかるのでしょうか? removeChild() バージョンは jQuery をクリアしていませんか?

デモ: jspref

4

1 に答える 1

8

ドキュメントから:

要素自体に加えて、要素に関連付けられたすべてのバインドされたイベントと jQuery データが削除されます。

これの意味は :

  • この関数が追加の作業を行うこと (主cleanDataにそれ自体と子を呼び出す)
  • メモリリークを避けるために一般的に使用する必要があります

これはソースコードに明確に現れます:

remove: function( selector, keepData ) {
    var elem,
        i = 0;

    for ( ; (elem = this[i]) != null; i++ ) {
        if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
            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;
}
于 2013-04-17T11:33:18.410 に答える