Ответ 1
Следующий пример работает без использования "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 спецификации HTML5, которая в этом дело в значительной степени документирует, что браузеры сделали в течение длительного времени.
Будет ли больше обход DOM, если я не сохраню идентификатор в переменной или это какой-то способ, которым уже является varible?
Это уже глобальная переменная, указанная выше, поэтому нет дополнительного обхода DOM. В глубоко вложенной функции может быть больше обхода цепочки объектов, но это вряд ли станет серьезной проблемой.
Но опять же, я настоятельно рекомендую не полагаться на автоматические глобальные элементы элемента. Вместо этого оберните свой код в функции определения области видимости (как показано на рисунке) и получите целевые элементы с getElementById
, querySelector
, querySelectorAll
и т.д., Если это необходимо. Если вы полагаетесь на автоматические глобальные переменные, шансы в конечном итоге вас укусят конфликт. Но это мнение.
Обратите внимание, что поиск элементов с помощью getElementById
действительно очень быстрый, поэтому ссылки на кеширование обычно не нужны по соображениям производительности (вы можете сделать это по другим причинам, например, при кодировании). Выглядеть вещи с помощью селекторов (querySelector
, querySelectorAll
) немного медленнее, но я бы сказал, что беспокоиться об этом, когда/если есть проблема.: -)