如果您查看 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
不是静态方法?
您发布的示例只是 3 个不同的示例连接成 1 个,它们都声明了一个新的 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
对象,这几乎是一个万无一失的方法。
使用一个实例与使用多个实例之间似乎没有显着差异。 规范说当前的API形状是由于历史原因造成的:
DOMParser 的设计作为一个需要构造然后调用其 parseFromString() 方法的类,是一个不幸的历史产物。如果我们今天设计这个功能,它将是一个独立的功能。对于解析 HTML,现代的替代方案是 Document.parseHTMLUnsafe()。
如果 MIME 类型是 text/xml,则生成的对象将是 XMLDocument,如果 MIME 类型是 image/svg+xml,则生成的对象将是 SVGDocument,如果 MIME 类型是 text/html,则生成的对象将是 HTMLDocument。
所以它不是关于一个解析器实例,而是关于我们需要的......
您发布的示例只是 3 个不同的示例连接成 1 个,它们都声明了一个新的 DOMParser。
您也可以通过一个解析器实例来完成此操作,但您只需根据您的具体要求在 parseFromString 方法中更改 MIME 类型即可。如果您需要所有这些,那么您必须通过同一个解析器实例使用不同的 MIME 类型调用 parseFromString 方法 3 次。希望这会对您有所帮助..