$().html(value) vs $().empty().append(value)


當需要清空某個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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM