Come menzionato nella risposta precedente, questo comportamento è noto come accesso con nome sull'oggetto finestra . Il valore name
dell'attributo per alcuni elementi e il valore id
dell'attributo per tutti gli elementi sono resi disponibili come proprietà window
dell'oggetto globale . Questi sono noti come elementi denominati. Poiché window
è l'oggetto globale nel browser, ogni elemento denominato sarà accessibile come variabile globale.
Questo è stato originariamente aggiunto da Internet Explorer e alla fine è stato implementato da tutti gli altri browser semplicemente per la compatibilità con i siti che dipendono da questo comportamento. È interessante notare che Gecko (il motore di rendering di Firefox) ha scelto di implementarlo solo in modalità stranezze , mentre altri motori di rendering lo hanno lasciato attivo in modalità standard.
Tuttavia, come di Firefox 14, Firefox ora supporta il nome di accesso sul window
oggetto in modalità standard pure. Perché hanno cambiato questo? Risulta che ci sono ancora molti siti che si basano su questa funzionalità in modalità standard. Microsoft ha persino rilasciato una demo di marketing che ha impedito il funzionamento della demo in Firefox.
Webkit ha recentemente considerato il contrario , relegando l'accesso denominato window
sull'oggetto solo alla modalità stranezze. Hanno deciso di non farlo con lo stesso ragionamento di Gecko.
Quindi ... folle come sembra che questo comportamento sia ora tecnicamente sicuro da usare nell'ultima versione di tutti i principali browser in modalità standard . Ma mentre l'accesso con nome può sembrare in qualche modo conveniente, non dovrebbe essere usato .
Perché? Gran parte del ragionamento può essere riassunto in questo articolo sul perché le variabili globali sono cattive . In poche parole, avere un sacco di variabili globali extra porta a più bug. Supponiamo che tu digiti accidentalmente il nome di a var
e ti capiti di digitare un id
nodo DOM, SORPRESA!
Inoltre, nonostante sia standardizzato, esistono ancora alcune discrepanze nelle implementazioni di accesso con nome del browser.
- IE rende erroneamente il valore
name
dell'attributo accessibile per gli elementi del modulo (input, select, ecc.).
- Gecko e Webkit in modo errato NON rendono i
<a>
tag accessibili tramite il loro name
attributo.
- Gecko gestisce in modo errato più elementi con lo stesso nome (restituisce un riferimento a un singolo nodo invece di una matrice di riferimenti).
E sono sicuro che c'è di più se provi ad usare l'accesso con nome su casi limite.
Come menzionato in altre risposte, utilizzare document.getElementById
per ottenere un riferimento a un nodo DOM dal suo id
. Se è necessario ottenere un riferimento a un nodo mediante il suo name
attributo, utilizzare document.querySelectorAll
.
Per favore, non propagare questo problema usando l'accesso denominato nel tuo sito. Così tanti sviluppatori web hanno perso tempo cercando di rintracciare questo comportamento magico . Dobbiamo davvero agire e ottenere motori di rendering per disattivare l'accesso denominato in modalità standard. A breve termine interromperà alcuni siti facendo cose cattive, ma a lungo termine contribuirà a far avanzare il web.
Se sei interessato ne parlo più dettagliatamente sul mio blog - https://www.tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/ .