Jak wspomniano we wcześniejszej odpowiedzi, takie zachowanie jest znane jako nazwany dostęp do obiektu okna . Wartość name
atrybutu dla niektórych elementów i wartość id
atrybutu dla wszystkich elementów są udostępniane jako właściwości window
obiektu globalnego . Są to tak zwane elementy nazwane. Ponieważ window
jest to obiekt globalny w przeglądarce, każdy nazwany element będzie dostępny jako zmienna globalna.
Zostało to pierwotnie dodane przez Internet Explorera i ostatecznie zostało zaimplementowane przez wszystkie inne przeglądarki po prostu w celu zapewnienia zgodności z witrynami zależnymi od tego zachowania. Co ciekawe, Gecko (silnik renderujący Firefoksa) postanowił zaimplementować to tylko w trybie dziwactw , podczas gdy inne silniki renderujące pozostawiały go w trybie standardowym.
Jednak, jak Firefox 14, Firefox obsługuje teraz o nazwie dostępu na window
obiekcie w trybie standardowym, jak również. Dlaczego to zmienili? Okazuje się, że wciąż wiele witryn korzysta z tej funkcjonalności w trybie standardowym. Microsoft wydał nawet demo marketingowe, które tak zrobiło, uniemożliwiając jego działanie w Firefoksie.
Webkit ostatnio rozważałwindow
coś przeciwnego , przenosząc nazwany dostęp do obiektu tylko do trybu dziwactwa. Zdecydowali się przeciw temu z tego samego powodu, co Gecko.
Więc… szalone, jak się wydaje, takie zachowanie jest teraz technicznie bezpieczne w najnowszej wersji wszystkich głównych przeglądarek w trybie standardowym . Ale chociaż nazwany dostęp może wydawać się nieco wygodny, nie należy go używać .
Dlaczego? Wiele argumentów można streścić w tym artykule na temat tego, dlaczego zmienne globalne są złe . Mówiąc najprościej, posiadanie szeregu dodatkowych zmiennych globalnych prowadzi do większej liczby błędów. Załóżmy, że przypadkowo wpisałeś nazwę a var
i zdarzyło Ci się wpisać an id
węzła DOM, SURPRISE!
Ponadto, pomimo ujednolicenia, nadal istnieje sporo rozbieżności w implementacjach nazwanego dostępu do przeglądarki.
- IE niepoprawnie udostępnia wartość
name
atrybutu dla elementów formularza (input, select itp.).
- Gecko i Webkit nieprawidłowo NIE udostępniają
<a>
tagów za pomocą ich name
atrybutu.
- Gecko niepoprawnie obsługuje wiele nazwanych elementów o tej samej nazwie (zwraca odwołanie do pojedynczego węzła zamiast tablicy odniesień).
I jestem pewien, że jest więcej, jeśli spróbujesz użyć nazwanego dostępu w przypadkach na krawędzi.
Jak wspomniano w innych odpowiedziach, użyj, document.getElementById
aby uzyskać odniesienie do węzła DOM przez jego id
. Jeśli potrzebujesz uzyskać odwołanie do węzła, name
użyj jego atrybutu document.querySelectorAll
.
Proszę nie rozpowszechniać tego problemu przy użyciu dostępu nazwanego w swojej witrynie. Tak wielu programistów internetowych zmarnowało czas, próbując wyśledzić to magiczne zachowanie. Naprawdę musimy podjąć działania i uzyskać silniki renderujące, aby wyłączyć dostęp nazwany w trybie standardów. W krótkim okresie spowoduje to uszkodzenie niektórych witryn, które robią złe rzeczy, ale na dłuższą metę pomoże to rozwinąć sieć.
Jeśli jesteś zainteresowany, mówię o tym bardziej szczegółowo na moim blogu - https://www.tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/ .