关于javascript:尝试使用DOMParser解析html字符串的麻烦

troubles trying to parse an html string with DOMParser

摘要如下:

1
2
3
4
5
6
7
8
9
html  ="<!doctype html>";
html +="<html>";
html +="<head>test</head>";
html +="<body><p>test</p></body>";
html +="</html>";

parser = new DOMParser();

dom = parser.parseFromString (html,"text/html");

尝试执行这些行时出现错误:

错误:组件返回了失败代码:0x80004001(NS_ERROR_NOT_IMPLEMENTED)[nsIDOMParser.parseFromString]

我试图弄清楚发生了什么,但是代码似乎是正确的,并且我在网上搜索了,我没有任何线索来到这里。

您之前遇到过这种故障吗?如果是,该错误隐藏在哪里?


您应该使用JavaScript DOMParser中描述的DomParser函数访问innerHTML和其他属性

我为您创建了小提琴http://jsfiddle.net/CSAnZ/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
 * DOMParser HTML extension
 * 2012-02-02
 *
 * By Eli Grey, http://eligrey.com
 * Public domain.
 * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
 */
 

/*! @source https://gist.github.com/1129031 */  
/*global document, DOMParser*/  

(function(DOMParser) {  
   "use strict";  
    var DOMParser_proto = DOMParser.prototype  
      , real_parseFromString = DOMParser_proto.parseFromString;

    // Firefox/Opera/IE throw errors on unsupported types  
    try {  
        // WebKit returns null on unsupported types  
        if ((new DOMParser).parseFromString("","text/html")) {  
            // text/html parsing is natively supported  
            return;  
        }  
    } catch (ex) {}  

    DOMParser_proto.parseFromString = function(markup, type) {  
        if (/^\\s*text\\/html\\s*(?:;|$)/i.test(type)) {  
            var doc = document.implementation.createHTMLDocument("")
              , doc_elt = doc.documentElement
              , first_elt;

            doc_elt.innerHTML = markup;
            first_elt = doc_elt.firstElementChild;

            if (doc_elt.childElementCount === 1
                && first_elt.localName.toLowerCase() ==="html") {  
                doc.replaceChild(first_elt, doc_elt);  
            }  

            return doc;  
        } else {  
            return real_parseFromString.apply(this, arguments);  
        }  
    };  
}(DOMParser));