检测JavaScript中使用的XML或SGML解析器

Joh*_*ohn -1 html javascript xhtml parsing

HTML是SGML的子集.

XHTML是XML的子集.

两者都使用单独的解析器.

假定正确地提供HTML文档并正确地提供text/htmlXHTML应用程序,application/xhtml+xml因为可以检测用于呈现页面的解析器,如果是,如何?

  • 确切地理解我在问什么.请不要坚持问我为什么要这样做.

  • 我宁愿不接受答案,表明我不使用一种语言或另一种语言.这是为了避免争论并帮助产生我可以使用的答案.

Alo*_*hci 7

[这是我原来答案的替代品.我最初的想法是利用innerHTML行为的差异.虽然它在IE9,Firefox和Chrome中运行良好,但事实证明它在Opera中失败了,它似乎使用了内部HTML的HTML解析器,即使对于作为application/xhtml+xml]的页面也是如此


除了HTML文档之外,没有太多方法可以告诉XML文档.然而,一种方法是利用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>
Run Code Online (Sandbox Code Playgroud)

看到它的实际效果: