Есть ли спецификация, что id элементов должен быть глобальной переменной? - PullRequest
39 голосов
/ 17 июня 2011

Если у меня есть <div id='a'> в Chrome, тогда в javascript я могу сделать a.<em>stuff()</em> (это как если бы a - глобальная переменная).

Однако это не работает с FireFox - мне нужно будет использовать document.getElementById('a').

Что такое правильное поведение здесь? (согласно спецификации W3)

Также меня интересует, как Chrome разрешит неоднозначность, если у меня есть div с идентификатором a, но в моем скрипте тоже есть глобальная переменная с именем a. Поведение будет случайным и странным?

И как будет переведен элемент с идентификатором, состоящим из дефисов ("-"), двоеточий (":") и точек (".") (Хорошо, я знаю, что к ним можно получить доступ с помощью document.getElementById, но как браузер переводит его в глобальную переменную, которая их представляет)

Ответы [ 5 ]

40 голосов
/ 17 июня 2011

Это зависит от того, какую спецификацию вы читаете.:)

Это поведение не описывается спецификацией HTML4 (ср., http://www.w3.org/TR/1999/REC-html401-19991224/struct/global.html#adef-id и http://www.w3.org/TR/1999/REC-html401-19991224/types.html#type-name). Однако оно было введено Internet Explorer и затем скопировано в другие основные браузеры для совместимости.FireFox также отображает это поведение, но только в режиме quirks (и даже тогда его реализация кажется ошибочной).

Спецификация WHATWG HTML в настоящее время требует такое поведение, но естьявляется открытой ошибкой , требующей ее удаления.

Независимо от соответствия спецификации, использование глобального пространства имен (т. е. window) для кода приложения обычно считается плохим поведением. Рассмотрим элемент ссылкиИдентификаторы, использующие удобные методы document.getElementById() или jQuery (например, $("#a")) и использующие переменные области действия, чтобы избежать введения новых переменных в глобальное пространство имен.

Более длительное обсуждение этого поведения в Список рассылки WHATWG .

11 голосов
/ 17 июня 2011

С самого начала IE создавал глобальные переменные, которые ссылаются на элементы по их имени или значению атрибута id.Это никогда не было хорошей идеей, но было скопировано другими браузерами, чтобы быть совместимым с сайтами, созданными для IE.

Это плохая идея и не должна копироваться или использоваться.

Редактировать

Чтобы ответить на ваши дополнительные вопросы:

... как Chrome разрешит неоднозначность, если у меня есть div с id, но в моем скрипте есть глобальная переменная с именем тоже.

В IE (который ввел это поведение), если глобальная переменная объявлена ​​с тем же именем, что и идентификатор элемента или имя, она будет иметь приоритет.Однако необъявленные глобалы не работают таким образом.Это не займет много времени, чтобы проверить это в Chrome (у меня есть, но я не собираюсь давать вам ответ).

И как будет элемент с id, состоящий из дефисов ("-"), двоеточия (":") и точки (".") должны быть переведены (хорошо, я знаю, что к ним можно получить доступ с помощью document.getElementById, но как браузер переведет его в глобальную переменную, которая их представляла)

Точно так же, как любое имя свойства объекта, которое не является допустимым идентификатором - нотация в квадратных скобках (т. Е. Window ['name-or-id']).

3 голосов
/ 17 июня 2011

Технически, этот вопрос является мнением, но это хороший вопрос.

IE также делает это, и у некоторых это вызывает головную боль.

Правила дляИмена переменных в JavaScript и идентификаторов в HTML различны.Я не вижу, как это хорошо.

Например, на этой странице есть элемент с идентификатором «notify-container».Это неверное имя JavaScript вообще.

Кроме того, когда эти имена связаны?Если встроенный скрипт объявляет переменную, а затем появляется элемент, который имеет приоритет?

Это нельзя сделать согласованным.

0 голосов
/ 09 февраля 2017

Хуже всего то, что при использовании элементов таким способом они могут сломаться в любое время, если будет введен новый API с таким же именем в глобальной области видимости.

Например, если это было до добавления Performance API

<p id="performance"></p>
<script>
    performance.innerHTML = "You're doing great"
</script>

Тогда этот фрагмент кода перестал бы работать сейчас в последних браузерах, которые реализовали Performance API как глобальный объект performance.

0 голосов
/ 17 июня 2011

Я думаю, что document.getElementById до сих пор поддерживается большинством браузеров. Это лучше и безопаснее при использовании этого ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...