обработка в XML-документах

#xml #xhtml #mime-types #web-standards #noscript

#xml #xhtml #mime-типы #веб-стандарты #noscript

Вопрос:

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

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

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

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

Ответ №1:

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

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

Для application / xhtml xml в проекте говорится:

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

Элемент noscript эффективен только в синтаксисе HTML, он не имеет никакого эффекта в синтаксисе XHTML.

Таким образом, в application /xhtml xml содержимое noscript должно отображаться независимо от того, доступны сценарии или нет. Конечно, если включен скриптинг, довольно тривиально использовать script для удаления таких элементов из 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 все еще пытался загрузить изображение.

Комментарии:

1. Я использую не HTML5 doctype, а XHTML 1.1. Полагаю, это имеет значение, не так ли? Пожалуйста, поправьте меня, если я ошибаюсь. Я немного поэкспериментировал и могу утверждать, что в application / xhtml xml содержимое noscript НЕ отображается, если JS отключен, но все еще загружается (имеется соответствующий http-запрос / ответ). Неужели все современные браузеры не следуют стандартам при работе с XML-документами? Если я удалю noscript (или его содержимое) из DOM (когда JS включен), будет ли его содержимое по-прежнему загружено до их удаления?

2. Doctype не имеет никакого значения вообще. Но смотрите мое исправление выше.

3. Спасибо за ваш ответ с быстрым и удобным примером. Чтобы немного подвести итог, я нашел следующее в wiki. whatwg.org/wiki/HTML_vs._XHTML (на самом деле, в нем указано то же, что и в вашем ответе, но без какой-либо ссылки на подтверждение): «В HTML, если скриптинг включен, элемент noscript анализируется как элемент CDATA. Если скриптинг отключен, он анализируется как обычный элемент. В XHTML элемент всегда анализируется как обычный элемент<..>»

4. Будьте осторожны, если используете его для отслеживания рекламы.