2009-04-16 18 views
6

Yazmakta olduğum belirli bir komut dosyasında, bazı DOM Öğelerine bağlı bazı nesneler var. Her bir öğenin benzersiz bir kimliği olduğu göz önünde bulundurulduğunda, her nesne yalnızca öğenin kimliğini tutmalı ve (öğeyi her zaman document.getElementById kullanıyorsa) veya öğeyi bir özellikte saklamalı mı?DOM öğelerine başvuruları kaydetme

Burada ne demek istediğimi basitleştirilmiş örnek:

function myThing(elId) { 
    this.elId = elId; 
} 
myThing.prototype.getElValue = function() { 
    return document.getElementById(this.elId).nodeValue; 
}; 

// -- vs -- // 

function myThing(elId) { 
    this.el = document.getElementById(elId); 
} 
mything.prototype.getElValue = function() { 
    return this.el.nodeValue; 
}; 

herhangi bir fark yaratır mı? Bilmem gereken herhangi bir performans sorunu var mı?

cevap

4

Öğeyi depolarım; document.getElementById öğesini her zaman çağırmazsanız kod temizliği yapma eğilimindedir ve sizin durumunuzda kimlikleri değiştirmenize veya kimlikleri olmayan öğelere izin vermenize gerek olmayabilir, ancak bunu yapmak oldukça yaygındır.

(getElementById oldukça tarayıcılarda iyi optimize olma eğilimindedir olarak apphacker aksine ben, bunu yaparken büyük verimlilik iyileştirmeleri beklemek değildir.)

Bilmem gereken herhangi bir performans sorunları var mı? DOM nesnelerine JavaScript nesnelerden

Kaynaklar kendi başlarına iyidir, ancak bir DOM nesnesi (genellikle bir olay işleyicisi aracılığıyla) geri böyle bir JavaScript nesnesine bağlantı olduğunda, bir referans döngüsü var. Bu, IE6-7'nin tekrarlanan nesnelerin serbest kalmaması nedeniyle bellek sızdırmasına neden olur. Küçük basit uygulamalar için umursamayabilirsiniz. Karmaşık, uzun süredir çalışan uygulamalar için, örneğin, her olay işleyicisini bir arama haritası/dizisi aracılığıyla dolaylı olarak indirerek, DOM nesnesinden gerçek olay işleyicisine doğrudan bir başvuru bulunmadığından sorunu çözmek zorunda kalabilirsiniz.

3

Mağaza öğesi değil id, görünüm yukarı yavaş ve pahalıdır ve size bir işlev çağrısı kaydeder. Basit bir testin bunu onaylayacağını düşünüyorum.