创建新的DOMParser实例有什么意义?

时间:2016-10-11 12:41:38

标签: javascript domparser

如果您从MDN查看DOMParser示例:

var parser = new DOMParser();
var doc = parser.parseFromString(stringContainingXMLSource, "application/xml");
// returns a Document, but not a SVGDocument nor a HTMLDocument

parser = new DOMParser();
doc = parser.parseFromString(stringContainingXMLSource, "image/svg+xml");
// returns a SVGDocument, which also is a Document.

parser = new DOMParser();
doc = parser.parseFromString(stringContainingHTMLSource, "text/html");
// returns a HTMLDocument, which also is a Document.

他们不断创建new DOMParser个实例。但为什么?不会有一个解析器实例吗?那些进行大量解析的代码,在创建新实例时是否具有性能优势?

编辑:人们对这个例子感到很不满。更好地说出我的问题: 为什么DOMParser更像JSON及其parse方法?为什么不是parseFromString静态方法?

2 个答案:

答案 0 :(得分:4)

您发布的示例只是连接成1的3个不同示例,它们都声明了一个新的DOMParser,因此每个都可以自行运行。

  

也许,但通常我会看到很多代码(新的   的DOMParser).parseFromString。

如果他们使用(new DOMParser()).parseFromString,因为他们只使用一次,并且他们在其他任何地方都不需要它,因此为它创建一个单独的变量是多余的。

此代码:

var
  proto = DOMParser.prototype
, nativeParse = 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) {}

proto.parseFromString = function(markup, type) {
    if (/^\s*text\/html\s*(?:;|$)/i.test(type)) {
        var
          doc = document.implementation.createHTMLDocument("")
        ;
            if (markup.toLowerCase().indexOf('<!doctype') > -1) {
                doc.documentElement.innerHTML = markup;
            }
            else {
                doc.body.innerHTML = markup;
            }
        return doc;
    } else {
        return nativeParse.apply(this, arguments);
    }
};

如果浏览器不支持DOMParser对象,那么这几乎是故障安全的。

答案 1 :(得分:0)

如果MIME类型是text / xml,则生成的对象将是XMLDocument,如果MIME类型是image / svg + xml,则它将是SVGDocument,如果MIME类型是text / html,则它将是HTMLDocument的。

所以它不是关于一个解析器实例,而是关于我们需要的...

您发布的示例只是连接成1的3个不同示例,它们都声明了一个新的DOMParser。

您也可以通过一个解析器实例来执行此操作,但您只需根据您的具体要求在parseFromString方法中更改MIME类型。如果你需要所有这些,那么你必须通过相同的解析器实例调用不同MIME类型的parseFromString方法3次。希望这对你有用..