Следующий пример работает без использования "document.getElementById ('myId')". Почему это и нормально ли пропустить «document.getElementById ('myId»)?
Поскольку браузеры свалка ссылки на все элементы с id
в глобальное пространство имен, используя id
в качестве имени переменного. (Технически, как свойство имя глобального объекта; свойства глобального объекта - это глобальные переменные.) Я настоятельно рекомендую , а не, полагаясь на него и используя вместо этого document.getElementById
(или аналогичный). Глобальное пространство имен действительно переполнено, и есть много других вещей, которые могут конфликтовать.
Например, если у вас есть
<div id="foo">...</div>
и
function foo() {
}
Тогда просто используя foo
в коде даст вам функцию, а не элемент.
Точно так же, если у вас есть
<input type="text" id="name">
... и использовать name
в вашем коде, вы получите имя окна (строка), а не HTMLInputElement
для id="name"
поля.
Эта работа по сбросу ссылок на элементы в глобальное пространство имен покрывается в §5.2.4 of the HTML5 spec, что в этом случае в значительной степени документирует, что браузеры сделали в течение длительного времени.
Будет ли больше обход DOM, если я не сохраню идентификатор в переменной или это какой-то вариант, который уже есть?
Это уже глобальная переменная, указанная выше, поэтому нет дополнительного обхода DOM. В глубоко вложенной функции может быть больше обхода цепочки объектов, но вряд ли это будет серьезной проблемой.
Но опять же, я настоятельно рекомендую не полагаться на автоматических глобалов элементов. Вместо этого оберните свой код в функции определения области видимости (как показано на рисунке) и получите целевые элементы с getElementById
, querySelector
, querySelectorAll
и т. Д., В зависимости от ситуации. Если вы полагаетесь на автоматические глобальные переменные, шансы в конечном итоге вас укусят конфликт. Но это мнение.
Обратите внимание, что глядя элементы с getElementById
является действительно очень быстро, поэтому ссылки кэширования обычно не требуется по соображениям производительности (вы можете сделать это по другим причинам, например кодирования удобства). Выглядеть вещи с селекторами (querySelector
, querySelectorAll
) немного медленнее, но я бы сказал, что беспокоиться об этом, когда/если есть проблема. :-)
jsfiddle: http://jsfiddle.net/feeela/2zr5Lgfo/ – feeela
Когда на веб-странице требуется много таких элементов, может быть, не стоит хранить все. –