2010-02-23 8 views
17

डीओएम में एचटीएमएल कोड जोड़ने के दो तरीके हैं और मुझे नहीं पता कि ऐसा करने का सबसे अच्छा तरीका क्या है।क्या आप आंतरिक HTML का उपयोग करके या नए तत्वों को एक-एक करके बनाकर डीओएम में HTML जोड़ना चाहिए?

सबसे पहले विधि

पहला रास्ता आसान एक है, मैं बस (jQuery के साथ) एचटीएमएल कोड $('[code here]').appendTo(element); का उपयोग कर element.innerHTML = [code here]; बहुत पसंद

दूसरी विधि है जो जोड़ सकता है

एक और तरीका सभी तत्वों को एक-एक करके बनाना है:

// New div-element 
var div = $('<div/>', { 
       id: 'someID', 
       class: 'someClassname' 
      }); 

// New p-element that appends to the previous div-element 
$('<p/>', { 
    class: 'anotherClassname', 
    text: 'Some textnode', 
}).appendTo(div); 

यह विधि document.createElement और element.setAttribute जैसे मूल कार्यों का उपयोग करती है।

मुझे पहली विधि का उपयोग कब करना चाहिए और दूसरा कब? विधि विधि से दो तेज है? -

संपादित speed tests

मैं जहाँ से कोड इस प्रकार तीन गति परीक्षण किया था के परिणाम:

$(document).ready(function(){ 
    // jQuery method - Above mentioned as the second method 
    $('#test_one').click(function(){ 
     startTimer(); 
     var inhere = $('#inhere'); 
     for(i=0; i<1000; i++){ 
      $(inhere).append($('<p/>', {'class': 'anotherClassname' + i, text: 'number' + i})); 
     } 
     endTimer(); 
     return false; 
    }); 

    // I thought this was much like the jQuery method, but it was not, as mentioned in the comments 
    $('#test_two').click(function(){ 
     startTimer(); 
     var inhere = document.getElementById('inhere'); 
     for(i=0; i<1000; i++){ 
      var el = document.createElement('p') 
      el.setAttribute('class', 'anotherClassname' + i); 
      el.appendChild(document.createTextNode('number' + i)); 
      inhere.appendChild(el); 
     } 
     endTimer(); 
     return false; 
    }); 

    // This is the innerHTML method 
    $('#test_three').click(function(){ 
     startTimer(); 
     var inhere = document.getElementById('inhere'), el; 
     for(i=0; i<1000; i++){ 
      el += '<p class="anotherClassname' + i + '">number' + i + '</p>'; 
     }     
     inhere.innerHTML = el; 
     endTimer(); 
     return false; 
    }); 
}); 

कौन दे दी है निम्नलिखित वास्तव में आश्चर्य की बात परिणाम

   Test One Test Two Test Three 
+-------------+---------+----------+------------+ 
| Chrome 5 | ~125ms | ~10ms | ~15ms | 
| Firefox 3.6 | ~365ms | ~35ms | ~23ms | 
| IE  8 | ~828ms | ~125ms | ~15ms | 
+-------------+---------+----------+------------+ 

कुल मिलाकर आंतरिक HTML विधि सबसे तेज़ प्रतीत होती है और कई मामलों में सबसे अधिक पढ़ने योग्य है।

उत्तर

2

मैं अपने लिए परीक्षण करने वाले लोगों के प्रयोजनों के लिए पुराना article इंगित करता हूं। डीओएम विधियों ने वास्तव में मेरी सभी मशीनों पर भीतरी HTML को हराया ताकि मैं यही पसंद करूं। हालांकि, आलेख के समय आंतरिक HTML पर औसत था। वर्तमान में अंतर केवल विशाल डेटासेट में ही देखा जा सकता है।

+1

गति केवल चिंता नहीं है ... कई बार, 'पहली विधि' जैसी लिखी गई कोड 'दूसरी विधि' से असीम रूप से अधिक पठनीय होगी। –

0

यदि मैं कोड में बाद में div का पुन: उपयोग करने जा रहा हूं, तो मैं इसे बनाउंगा और इसे एक var में डाल दूंगा, जो कि एक $ prefix के साथ है, इसलिए मुझे पता है कि यह एक jquery वस्तु है। यदि यह एक बंद बात मैं हूँ बस एक कार्य करें:

$('body').append(the stuff) 
2

वास्तव में, न तरीकों, innerHTML का उपयोग दोनों ही मामलों jQuery डोम नोड्स के लिए HTML में कनवर्ट करता है। jQuery-1.3.2.js से:

// If a single string is passed in and it's a single tag 
// just do a createElement and skip the rest 
if (!fragment && elems.length === 1 && typeof elems[0] === "string") { 
    var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); 
    if (match) 
     return [ context.createElement(match[1]) ]; 
} 

// ... some more code (shortened so nobody falls asleep) ... 

// Convert html string into DOM nodes 
if (typeof elem === "string") { 
    // Fix "XHTML"-style tags in all browsers 
    elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ 
     return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? 
      all : 
      front + "></" + tag + ">"; 
    }); 
    // etc... 
} 

सामान्य शब्दों में, का उपयोग कर innerHTML डोम से छेड़छाड़ की तुलना में धीमी है, क्योंकि यह HTML पार्सर (जो वैसे भी डोम में HTML पार्स जाएगा) invokes।

संबंधित मुद्दे