Строгий тип документа, запрещающий доступ к переменной DOM в FireFox
Вопрос
Я не знаю, хорошо ли это известная «вещь» или что-то новое в той версии Firefox, которую он только что обновил, но в любом случае я понятия не имею, как найти этот вопрос в Google, поэтому мне придется его задать. здесь.
У меня есть DIV в моем DOM, к которому я пытаюсь получить прямой доступ по идентификатору, в самой простой форме, например:
alert(btnTest.id);
Это отлично работает во всех браузерах, но вызывало проблемы в Firefox, которые фактически приводили к тому, что браузер находился в странном «сломанном» состоянии.
Я получал ошибку: «btnTest не определен».Я не получал этой ошибки в Safari, Internet Explorer или Chrome.
Я предположил, что у меня не совпадают HTML-теги, фигурные скобки JavaScript или что-то еще.В конце концов, удалив все, я попытался удалить DOCTYPE.Внезапно в Firefox (версия 3.0.10) он начал возвращать правильный идентификатор, как и ожидалось.
Что происходит!!!??Конечно, «строгий» режим должен позволять мне получать доступ к именованным элементам, а если нет, то почему все остальные браузеры позволяют мне это делать.
Примечание: Я могу легко обойти это с помощью $('#btnTest')[0].id, что мне и придется делать сейчас, пока я не найду лучшее решение.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" class="blueCircles">
<head>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script>
$(function() {
alert("ID retrieved through jQuery: " + $('#btnTest')[0].id);
alert("ID retrieved by accessing global variable: " + btnTest.id);
});
</script>
</head>
<body>
<div id="btnTest">
</div>
</body>
</html>
Решение
Ни в одной спецификации W3C нет ничего, что говорило бы, что ссылки на объекты должны быть установлены в глобальной области сценариев для элементов с id
атрибуты.Считается, что это неоправданно загрязняет глобальное пространство имен и может привести к в запутанных ошибках.
Firefox устанавливает ссылки при работе в режиме совместимости в целях совместимости с IE.Джонни Стенбек объясняет в третьем комментарии к ошибка добавления этой поддержки почему это не поддерживается в стандартном режиме:
Эта функция влияет на стандартный соответствующий код, который, например, проверяет для существования [так в оригинале] глобальной переменной, чтобы установить ее только один раз.С этим изменением это «варьируемое» [так в оригинале] теперь может быть ссылка на элемент в документе, и код может не работать так, как предполагал разработчик.
Вот почему мы решили сделать только эти причуды.