Определить синтаксический анализатор XML или SGML, используемый в JavaScript - PullRequest
0 голосов
/ 15 декабря 2011

HTML - это подмножество SGML.

XHTML - это подмножество XML.

Оба используют отдельные синтаксические анализаторы.

Предполагается, что документ HTML правильно обслуживается как text/html и приложение XHTML правильно отображается как application/xhtml+xml возможно ли определить, какой синтаксический анализатор используется для визуализации страницы, и если да, то как?

  • Я точно понимаю точно что я спрашиваю.Пожалуйста, не настаивайте на том, чтобы спрашивать, почему я хочу это сделать.

  • Я бы предпочел не получать ответы, предполагающие, что я не использую тот или иной язык.Это поможет избежать споров и поможет найти ответ, который я смогу использовать.

1 Ответ

7 голосов
/ 16 декабря 2011

[Это замена моего первоначального ответа. Моя оригинальная идея состояла в том, чтобы использовать различия в поведении innerHTML. Хотя он отлично работал в IE9, Firefox и Chrome, оказалось, что это не удалось в Opera, которая, похоже, использует HTML-парсер для innerHTML даже для страниц, обслуживаемых как application/xhtml+xml]


Существует не так много способов отличить XML-документы от HTML-документов. Однако одним из способов является использование различий в обращении с кейсами между HTML и XML

В частности, поведение Element.tagName отличается. В разобранном HTML-документе имя элемента будет приведено к верхнему регистру для tagName, тогда как в разобранном XML-документе его не будет. Таким образом, мы можем протестировать document.createElement("div").tagName == "DIV", который даст другой результат в зависимости от того, как был проанализирован документ.

См. Этот тестовый пример:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>      
        <title>Test Case</title>
        <script>
            window.onload = function() {
              document.getElementById("result")
                .appendChild(document.createTextNode(
                  (document.createElement("div").tagName == "DIV") 
                    ? "HTML parser" : "XML parser"));
            }
        </script>
    </head>
    <body>
        <p id="result"></p>
    </body>
</html>

Увидеть это в действии:

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