[Это замена моего первоначального ответа. Моя оригинальная идея состояла в том, чтобы использовать различия в поведении 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>
Увидеть это в действии: