2009-04-16 11 views
6

In un particolare script che sto scrivendo, ho un numero di oggetti che sono collegati ad alcuni elementi DOM. Dato che ogni elemento ha un ID univoco, ogni oggetto dovrebbe conservare solo l'id dell'elemento (e usare document.getElementById ogni volta) o memorizzare l'elemento in una proprietà?Memorizzazione di riferimenti a elementi DOM

Ecco un esempio semplificato di ciò che intendo:

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; 
}; 

Se la soluzione sia differenza? Ci sono problemi di prestazioni che dovrei sapere?

risposta

4

Vorrei memorizzare l'elemento; tende a rendere il codice più chiaro quando non chiami document.getElementById tutto il tempo, e anche se nel tuo caso potresti non aver bisogno di cambiare ID o di consentire elementi senza ID, è piuttosto comune voler farlo.

(differenza apphacker non mi aspetto enormi miglioramenti di efficienza dal fare così, come getElementById tende ad essere abbastanza ben ottimizzato nei browser.)

ci sono problemi di prestazioni che dovrei sapere?

I riferimenti dagli oggetti JavaScript agli oggetti DOM vanno bene da soli, ma quando un oggetto DOM ha un collegamento a tale oggetto JavaScript (di solito attraverso un gestore di eventi), hai un ciclo di riferimento. Ciò fa sì che IE6-7 perdi memoria poiché non riesce a liberare gli oggetti in ciclo. Per piccole e semplici app potresti non interessarti. Per le app complicate e di lunga durata, potrebbe essere necessario aggirare il problema, ad esempio indiriz- zando ogni gestore di eventi tramite una mappa/matrice di ricerca, in modo che non vi siano riferimenti diretti dall'oggetto DOM al gestore di eventi reali.

3

Memorizza l'elemento non id, la ricerca è lenta e costosa e consente di risparmiare una chiamata di funzione. Penso che un semplice test lo confermerebbe.

Problemi correlati