如果您从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
静态方法?
答案 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次。希望这对你有用..