當需要清空某個dom結點內容時,我所知道的有兩種方法:
1.Element.removeChild(child)
// Removing all children from an element
var element = document.getElementById("test");
while (element.firstChild) {
element.removeChild(element.firstChild);
}
2.Element.innerHTML=""
第一種方式雖然可讀性較好,但顯然不如第二種方法簡潔。
理論上方式2會比方式1快很多,從代碼上來分析也是如此,至少方式二不用做while循環,也不用判斷屬性。事實上也的確如此,但只限於子結點較少的情況下。
在子結點個數多過的情況下,方式1是優於方式2的。性能測試之killing a lots of kids
jquery提供了兩個類似的接口與之相對應:
1.$().empty()
2.$().html('')
所以,替換dom內容也同樣有兩種方式:
1.$().empty().append(HTMLString|HTMLElement|jQueryElement)
2.$().html(HTMLString)
jQuery 1.9.1 empty方法實現如下,與方式1相似
empty: function() {
var elem,
i = 0;
for ( ; (elem = this[i]) != null; i++ ) {
// Remove element nodes and prevent memory leaks
if ( elem.nodeType === 1 ) {
jQuery.cleanData( getAll( elem, false ) );
}
// Remove any remaining nodes
while ( elem.firstChild ) {
elem.removeChild( elem.firstChild );
}
// If this is a select, ensure that it displays empty (#12336)
// Support: IE<9
if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
elem.options.length = 0;
}
}
return this;
}
jQuery 1.9.1 html方法的實現:
html: function( value ) {
return jQuery.access( this, function( value ) {
var elem = this[0] || {},
i = 0,
l = this.length;
if ( value === undefined ) {
return elem.nodeType === 1 ?
elem.innerHTML.replace( rinlinejQuery, "" ) :
undefined;
}
// See if we can take a shortcut and just use innerHTML
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
value = value.replace( rxhtmlTag, "<$1></$2>" );
try {
for (; i < l; i++ ) {
// Remove element nodes and prevent memory leaks
elem = this[i] || {};
if ( elem.nodeType === 1 ) {
jQuery.cleanData( getAll( elem, false ) );
elem.innerHTML = value;
}
}
elem = 0;
// If using innerHTML throws an exception, use the fallback method
} catch(e) {}
}
if ( elem ) {
this.empty().append( value );
}
}, null, value, arguments.length );
},
可以看到,當傳入的參數不為html字符串時,會執行這樣的語句:
if ( elem ) {
this.empty().append( value );
}
不言而喻,當傳入的參數不為html字符串或html字符串較長時,$().empty().append(value)的性能會優於$().html(value),性能測試之jquery html vs empty append;
同時,基於代碼可讀性也建議優先使用$().empty().append(value)
refs :
jquery-html-vs-empty-append
kill-lots-kids
deleting-child-nodes-of-a-div-node
Element.innerHTML
