мне действительно нужно вызывать getElementById()?

Возможный дубликат:
IE /Chrome: здесь присутствуют глобальные переменные элементов дерева DOM?

Я только что наткнулся на неожиданное, но полезное поведение в браузере: он создает переменную для каждого элемента, имеющего идентификатор в моем html-коде. Итак, когда у меня есть:

<div id="ohlala"> ... </div>

браузер, похоже, запускает этот код за кулисами:

var ohlala = document.getElementById("ohlala");

поэтому я могу легко изменить текст этого элемента:

ohlala.innerHTML="test"

Попробуйте в Интернете: http://jsfiddle.net/Facby/ Вопрос в том, зачем мне написать document.getElementById() бит самостоятельно? Насколько переносим этот код? Я пробовал в Opera, FireFox и Chrome, и это работает! Могу ли я положиться на эту функцию? Всегда ли браузер создает переменные для каждого элемента с идентификатором? В этом случае я должен быть более осторожным с именами, которые используются в моем коде javascript, чтобы не конфликтовать с аналогичными идентификаторами из HTML, верно?


person AlexStack    schedule 20.09.2012    source источник
comment
Это обычное дело, но, насколько мне известно, не стандартное. Все началось в Internet Explorer, как вы понимаете. Более старые версии Firefox IIRC не поддерживают его, и я ничего не знаю об этом для мобильных браузеров.   -  person MaxArt    schedule 20.09.2012
comment
Кроме того, у вас есть много уже существующих свойств в объекте window, определение элементов с идентификаторами, соответствующими этим свойствам, не заменит их в объекте window, и вы окажетесь в ситуации, когда вам придется либо избегать определенных идентификаторов, либо используйте getElementById только для определенных идентификаторов.   -  person lanzz    schedule 20.09.2012
comment
это будет проблемой в нескольких формах. Где мы иногда используем document.form[].element   -  person Ashish Gupta    schedule 20.09.2012
comment
Я проверил его для Firefox 3.6, и он не работает. Кстати, вы проверяли, работает ли это при динамическом добавлении элементов в DOM? В IE и Chrome нормально, в остальных не знаю.   -  person MaxArt    schedule 20.09.2012
comment
Дубликат stackoverflow.com/q/3434278/1085285 stackoverflow.com/q/7826737/1085285   -  person Ashish Gupta    schedule 20.09.2012
comment
проблема (за исключением того, что это очень плохая практика) заключается в том, что вы будете смешивать переменные, как сказал @lanzz. откуда ты знаешь, что такое ohlaha? вам придется угадать   -  person Martin Trenker    schedule 20.09.2012
comment
да, ради удобочитаемости кода лучше этого избегать.   -  person AlexStack    schedule 21.09.2012


Ответы (1)


При создании элементов с идентификаторами объект «окно» получает определенные атрибуты, поэтому вы можете напрямую использовать переменные, это поведение устарело и обычно записывается так: window.ohlala.innerHTML = "...", это поведение сохраняется браузерами для совместимости с некоторым старым кодом. на веб-сайтах, но не рекомендуется использовать его на современных веб-сайтах, всегда используйте метод .getElementById(), этот метод является частью стандарта W3C, и вы можете использовать его во всех современных браузерах, в некоторых очень старых версиях браузеров и ‹ IE7 не будет работать. Узнайте больше о DOM (объектной модели документа) здесь: https://developer.mozilla.org/en-US/docs/DOM

person micnic    schedule 20.09.2012
comment
Какой конкретный стандарт W3C это будет? - person lanzz; 20.09.2012
comment
Можете ли вы указать документ, где это поведение стандартизировано? - person Sirko; 20.09.2012
comment
Вы можете найти все стандарты W3C здесь: w3c.org getElementById был введен в DOM Level 1 для документов HTML и перемещен во все документы. в DOM Level 2: w3.org/TR /DOM-Level-2-Core/core.html#ID-getElBId - person micnic; 20.09.2012
comment
@micnic Вы заметили, что вопрос касался не document.getElementById(), а неявной генерации переменной в dom браузером БЕЗ вызова document.getElementById()? - person Sirko; 20.09.2012
comment
@micnic Хорошо, я думаю, вы неправильно поняли вопрос. Смело удаляйте свой ответ... - person MaxArt; 20.09.2012
comment
@MaxArt Я не пользователь Windows, и я точно не знаю версии, в которых он не работает в IE, IE6 не поддерживает его на 100%. - person micnic; 20.09.2012
comment
@MaxArt, я улучшу свой ответ :) - person micnic; 20.09.2012
comment
@micnic IE6 имеет странную ошибку с getElementById, которая также возвращает элементы с соответствующим свойством name, а не только id, но каким-то образом это поддерживается. Кроме того, улучшение ответа будет хорошо, но я не представляю, как это сделать. Удиви меня :) - person MaxArt; 20.09.2012
comment
Я просмотрел документ, но в нем не упоминается это поведение: браузер автоматически создает переменную для каждого именованного элемента. - person AlexStack; 20.09.2012
comment
@AlexStack, мне очень жаль, я неправильно понял ваш вопрос, я отредактировал свой ответ, window.newVar это то же самое newVar, поэтому вы можете получить к нему доступ в глобальном контексте, но это устаревшее поведение. - person micnic; 20.09.2012
comment
@micnic Это поведение теперь является частью спецификации HTML5:dev.w3.org/html5/spec/ Это называется именованным доступом к объекту Window: dev.w3.org/html5/spec/single-page.html#dom-document-namemeditem - person AlexStack; 20.09.2012
comment
@AlexStack Я бы все же посоветовал снова полагаться на него, поскольку документ стандартов, на который вы ссылались, прямо предупреждает, что поставщики браузеров рассматривают возможность ограничения этого поведения режимом причуд. - person lanzz; 20.09.2012
comment
@AlexStack Читайте внимательно, это не одно и то же. Поведение, о котором вы говорили, относится к общим элементам DOM, которые создают window свойства, идентифицируемые их id. Ссылка, которую вы дали, имеет дело со свойствами объекта document, который соответствует некоторым соответствующим «именованным» элементам (объяснение нескольких строк после этого). - person MaxArt; 20.09.2012