【问题标题】:ParseFromString throws error in IE, but not in ChromeParseFromString 在 IE 中抛出错误,但在 Chrome 中没有
【发布时间】:2015-09-25 10:36:44
【问题描述】:

我正在为传单使用 KML 插件,该插件在 Google Chrome 中运行良好。然而,在 IE 中,它会在以下代码处引发错误。

parser=new DOMParser();
console.log(url) // outputs: "path/to/kmlfile.kml" in Chrome debugger
url=parser.parseFromString(url,"text/xml"); //This line throws a parser error in IE 11, but is fine in Chrome

在我看来,这段代码有一个错误——作者应该将一个实际的 XML 字符串,而不仅仅是一个 XML 文档的 url 传递给 parser.parseFromString() 函数。解析器会出错是有道理的,因为文件的路径不是有效的 XML 文件(注意:kml 文件只是 XML)。但是,这并不会导致 Chrome Debugger 工具中抛出任何错误,这真的很奇怪。

在我看来,这两种情况都应该失败。 DOMParser 上的可信 MDN 文档没有提到将 URL 作为参数放入 parseFromString() 中。所以我的问题是为什么这在 Chrome 中工作,但在 IE 中抛出错误,然后我该怎么做才能修复它?

请注意,此问题与以下 url 不同,因为这不是一般错误 - 这是关于在 Chrome 中有效但在 IE 中失败的内容:Internet Explorer 11 (IE 11) Throws Syntax Error using parseFromString in DOMParser

【问题讨论】:

    标签: javascript google-chrome internet-explorer domparser


    【解决方案1】:

    当 XML 是格式错误的非 Microsoft 浏览器(Firefox、Chrome 等)时,它将创建带有错误消息的 XML 文档作为其内容。点击here

    当 XML 在 Microsoft 浏览器、IE 和 Edge 中格式错误时,它会引发错误,将错误写入控制台并且您的脚本会停止。请注意,我使用的是 Mac,所以我已经远程测试了它,但没有机会亲自测试它。您可以将该代码放在 IE 的 try catch 块中,但我的意思是我不知道这是否会阻止它向控制台写入消息。

    这是带有故意格式错误的 XML 的 code pen,错误消息写入输出。 codepen 或输出中没有错误。我故意将错误代码从解析器写入输出窗口。打开控制台看看发生了什么。

    FWIW IE 是恕我直言的正确行为。直到最近才出现不抛出错误是互联网做事的方式。不抛出错误的问题是你不知道你做错了什么或在哪里。一次编写,调试一切。

    此外,直到最近的版本,IE 使用 ActiveX 来解析 XML 文档。

    来自 W3C XML validation 脚本:

    function validateXML(text) {
        var message;
        var parser;
        var xmlDoc;
    
        // code for Edge, IE, Mozilla, Firefox, Opera, etc.
        if (document.implementation.createDocument || window.DOMParser) {
            parser = new DOMParser();
    
            try {
                xmlDoc = parser.parseFromString(text, "text/xml");
            }
            catch (error) {
    
            }
    
            if (xmlDoc.getElementsByTagName("parsererror").length > 0) {
                return xmlDoc.getElementsByTagName("parsererror")[0];
            }
            else {
                return "No errors found";
            }
        }
        // code for older versions of IE
        else if (window.ActiveXObject) {
            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = "false";
    
            try {
                xmlDoc.loadXML(text);
            }
            catch (error) {
    
            }
    
            if (xmlDoc.parseError.errorCode != 0) {
                message = "Error Code: " + xmlDoc.parseError.errorCode + "\\n";
                message = message + "Error Reason: " + xmlDoc.parseError.reason;
                message = message + "Error Line: " + xmlDoc.parseError.line;
                return message;
            }
            else {
                return "No errors found";
            }
        }
    
        else {
            return "Not supported";
        }
    }
    

    相关question

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 2017-04-23
      • 2017-12-08
      • 2020-11-24
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多