Строгий тип документа, запрещающий доступ к переменной DOM в FireFox

StackOverflow https://stackoverflow.com/questions/805868

  •  03-07-2019
  •  | 
  •  

Вопрос

Я не знаю, хорошо ли это известная «вещь» или что-то новое в той версии 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.Джонни Стенбек объясняет в третьем комментарии к ошибка добавления этой поддержки почему это не поддерживается в стандартном режиме:

Эта функция влияет на стандартный соответствующий код, который, например, проверяет для существования [так в оригинале] глобальной переменной, чтобы установить ее только один раз.С этим изменением это «варьируемое» [так в оригинале] теперь может быть ссылка на элемент в документе, и код может не работать так, как предполагал разработчик.

Вот почему мы решили сделать только эти причуды.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top