2016-04-09 13 views
1

DOM'da birden çok isabeti önlemek için bir belge parçası veya eklenmemiş bir oluşturulmuş div kullanımı arasında bir fark var mı? Belge parçası VS eklenmemiş tanımlı oluşturuldu

en biz 100 liste öğeleri oluşturmak için söyleyelim

...

Bizim sayfanın içeriği:

<ul class="list"></ul> 

Senaryo 1: belge parçası

Bu senaryoda, biz' li'yi yaratıp, basit bir metinle doldurup, parçalara ekleyerek. Döngü bittiğinde, parça listeye eklenir. DOM 100x'lere ping atmaktan kaçınıyoruz ve sadece parçayı eklemek için bir kez ping ediyoruz.

var frag = document.createDocumentFragment(); 
for(var i = 1; i <= 100; i++) { 
    var li = document.createElement('li'); 
    li.textContent = 'Item #' + i; 
    frag.append(li); 
} 

document.querySelector('.list').appendChild(frag); 

Senaryo 2: Bu DOM'da olmadığından bu senaryoda un-eklenen div

, biz belge parçası gibi bir div görür oluşturun. Tüm oluşturulan li'si div'a ekliyoruz, sonra div'in içeriğini DOM'daki listeye ekliyoruz.

var div = document.createElement('div'); 
for(var i = 1; i <= 100; i++) { 
    var li = document.createElement('li'); 
    li.textContent = 'Item #' + i; 
    div.append(li); 
} 

document.querySelector('.list').innerHTML = div.innerHTML; 

Bu iki senaryo arasındaki fark nedir? DOM'a defalarca ping atmaktan kaçınmak için, her ikisinin de aynı sonucu elde ettiği görülmektedir.

+0

Performans hakkında merak ediyorsanız, neden [bu yanıt] (http://stackoverflow.com/a/35242602/99777) gibi bir JSPerf oluşturmuyorsunuz? – joeytwiddle

cevap

1

İkinci örnek çalışmaz.
appendChild işlevi bir nesneyi kabul etmelidir, ancak div.innerHTML bir dize döndürmelidir.

document.querySelector('.list').appendChild(div); 

Ama bu da div eklemek olacaktır:

Ne yapabilirsiniz budur. Bu nedenle, html yapınızı bozabilecek bir sarmalayıcı eleman olmadan birden fazla öğeyi bir kerede ekleyebilmek için parçanın mevcut olmasının nedeni budur.

document.querySelector('.list').innerHTML = div.innerHTML; 

Ama sonra varibale li artık DOM'da li eleman başvuru yapmıyor:

Ayrıca bu yapabilirdi. DOM'daki öğeler, div.innerHTML dizesinden oluşturulan yeni öğelerdir. Örneğin, bazı olay dinleyicilerini öğelere eklediyseniz, artık çalışmayacaklar.

+0

Başlıklar için teşekkürler. Kodumu şimdi çalışmakta olan 2. senaryoyu yansıtacak şekilde düzenledim. Yine de, 2 senaryo arasındaki farkı merak ediyorum. Li'nin dinleyicileri bile söz konusu olduğunda, senaryo 2'nin çalıştırılmasından sonra ya da olay temsilcisiyle ve vücuttaki dinleyiciyle elden önce iliştirebilirsiniz. –

+1

Bence daha çok kişisel bir tercih. Ne istersen kullanabilirsin. İkinci senaryo ile '.list 'öğesinin içeriğini kolayca üzerine yazabilirsiniz. Birincisi ile sadece ona daha fazla eleman eklersiniz. Ayrıca, yerine eklemek için 'innerHTML + = div.innerHTML' kullanabilirsiniz. Ancak, doğrudan elemanlar üzerinde herhangi bir olay varsa, delegasyon olmadan çalışmayı bırakırlardı. –

İlgili konular