‹noscript› обработка в документах XML

Есть ли разница в обработке блоков ‹noscript> для страниц, обслуживаемых с помощью MIME-типа text/html, по сравнению с MIME-типом application/xhtml+xml?

Насколько я заметил, блок ‹noscript> для страниц text/html вообще не обрабатывается, если в браузере отключен JavaScript. А что происходит со страницами application/xhtml+xml? Подозреваю, что для таких страниц блок все равно анализируется при отключенном JavaScript. Но никаких разъяснений по этому вопросу я не нашел.

Может ли кто-нибудь указать мне соответствующий стандарт W3C или дать какие-либо другие разъяснения?

PS. Интерес представляет сервис подсчета посещений, который использует блок ‹noscript> для отслеживания посетителей с отключенным JS. Если элементы (например, изображения нулевого размера) блоков ‹noscript> загружаются в любом случае, то такие сервисы должны ломаться :(


person Ilya Kurnosov    schedule 30.01.2010    source источник


Ответы (1)


Лучшее описание, вероятно, приведено в черновике HTML5 здесь: http://dev.w3.org/html5/spec/semantics.html#the-noscript-element.

В text/html детали того, что именно происходит, довольно сложны. Просто перейдите по ссылке выше. Здесь нет смысла воспроизводить.

Для application/xhtml+xml черновик говорит:

Элемент noscript нельзя использовать в документах XML.

Элемент noscript действует только в синтаксисе HTML и не действует в синтаксисе XHTML.

Таким образом, в application/xhtml+xml содержимое noscript должно отображаться независимо от того, доступны сценарии или нет. Конечно, если скрипты включены, довольно просто использовать скрипт для удаления таких элементов из DOM.

ИСПРАВЛЕНИЕ.

При дальнейшем исследовании я думаю, что приведенная выше цитата означает, что элемент noscript не влияет на парсинг.

В разделе XHTML здесь http://dev.w3.org/html5/spec/the-xhtml-syntax.html#the-xhtml-syntax, в черновике говорится

Ожидается, что пользовательский агент будет скрывать элементы noscript, для которых разрешено использование сценариев, независимо от правил CSS.

Итак, как вы говорите, когда сценарии включены, элемент noscript скрывает свое содержимое. Однако это все, что он делает, и изображения все равно загружаются. Кроме того, я пробовал это:

<html xml:lang="en-GB" xmlns="http://www.w3.org/1999/xhtml" lang="en-GB">
  <head> 
    <title>Test</title>
  </head>
  <body>
    <p>Test 1</p>
    <noscript id="ns">
      <p>Test 2</p>
      <script type="text/javascript">
        document.getElementById("ns").parentNode.removeChild(document.getElementById("ns"));
      </script>
      <img src="test.gif" alt="test"/>
    </noscript>
  </body>
</html>

И хотя узел noscript удален из dom, Firefox все равно пытался загрузить изображение.

person Alohci    schedule 30.01.2010
comment
Я использую тип документа не HTML5, а XHTML 1.1. Я думаю, это имеет значение, не так ли? Пожалуйста, поправьте меня, если я ошибаюсь. Я немного поэкспериментировал и могу утверждать, что в application/xhtml+xml содержимое noscript НЕ отображается, если JS отключен, но все равно загружается (есть соответствующий http-запрос/ответ). Все ли современные браузеры не следуют стандартам при работе с XML-документами? Если я удалю noscript (или его содержимое) из DOM (когда JS включен), будет ли его содержимое загружено до того, как оно будет удалено? - person Ilya Kurnosov; 30.01.2010
comment
Тип документа вообще не имеет значения. Но см. мою поправку выше. - person Alohci; 31.01.2010
comment
Спасибо за ваш ответ с быстрым и удобным примером. Чтобы добавить немного, я нашел следующее на wiki.whatwg.org/wiki/HTML_vs ._XHTML (фактически, он говорит то же самое, что и ваш ответ, но без какой-либо ссылки): в HTML, если сценарии включены, элемент noscript анализируется как элемент CDATA. Если сценарии отключены, он анализируется как обычный элемент. В XHTML элемент всегда анализируется как обычный элемент‹..› - person Ilya Kurnosov; 31.01.2010
comment
Будьте осторожны, если вы используете его для отслеживания рекламы. - person Yuhong Bao; 14.06.2011