Становятся ли элементы дерева DOM с идентификаторами глобальными переменными?
работая над идеей для простой оболочки HTMLElement я наткнулся на следующее для Internet Explorer и хром:
для данного HTMLElement с идентификатором в дереве DOM можно получить div, используя его идентификатор в качестве имени переменной. Так что для div, как
<div id="example">some text</div>
на Internet Explorer 8 и Chrome вы можете сделать:
alert(example.innerHTML); //=> 'some text'
или
alert(window['example'].innerHTML); //=> 'some text'
значит ли это каждый элемент в DOM дерево преобразуется в переменную в глобальном пространстве имен? И это также означает, что можно использовать это в качестве замены для getElementById
метод в этих браузерах?
4 ответа:
как упоминалось в предыдущем ответе, это поведение известно как именованный доступ к объекту окна. Значение
name
атрибут для некоторых элементов и значениеid
атрибут для всех элементов доступны в качестве свойств глобального доступно для элементов формы (ввод, выбор, и т. д.).геккон и Webkit неправильно не делают <a>
теги доступны через их .геккон неправильно обрабатывает несколько именованных элементов с одинаковым именем (он возвращает ссылку на один узел вместо массива ссылок). и я уверен, что есть больше, если вы попытаетесь использовать именованный доступ на крайних случаях.
как уже упоминалось в других ответов использовать
document.getElementById
чтобы получить ссылку на узел DOM по егоid
. Если вам нужно получить ссылку на узел по егоname
атрибут usedocument.querySelectorAll
.пожалуйста, пожалуйста, не распространяйте эту проблему с помощью именованного доступа на вашем сайте. Так много веб-разработчиков потратили время, пытаясь отследить это волшебный поведение. Нам действительно нужно принять меры и заставить механизмы рендеринга отключить именованный доступ в стандартном режиме. В краткосрочной перспективе это сломает некоторые сайты, делающие плохие вещи, но в долгосрочной перспективе это поможет продвинуть веб вперед.
Если вам интересно, я расскажу об этом более подробно в своем блоге - https://www.tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/.
вы должны придерживаться
getElementById()
в этих случаях, например:document.getElementById('example').innerHTML
IE любит смешивать элементы с
name
иID
атрибуты в глобальном пространстве имен, так что лучше быть явным о том, что вы пытаетесь сделать.
Да, они делают.
протестировано в Chrome 55, Firefox 50, IE 11, IE Edge 14 и Safari 10
в следующем примере:<!DOCTYPE html> <html> <head> </head> <body> <div id="im_not_particularly_happy_with_that"> Hello World! </div> <script> im_not_particularly_happy_with_that.innerText = 'Hello Internet!'; </script> <!-- Looking at you W3 HTML5 spec group ಠ_ಠ --> </body> </html>