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

问题描述 投票:0回答:3

如果您查看 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
不是静态方法?

javascript domparser
3个回答
2
投票

您发布的示例只是 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
对象,这几乎是一个万无一失的方法。


0
投票

使用一个实例与使用多个实例之间似乎没有显着差异。 规范说当前的API形状是由于历史原因造成的:

DOMParser 的设计作为一个需要构造然后调用其 parseFromString() 方法的类,是一个不幸的历史产物。如果我们今天设计这个功能,它将是一个独立的功能。对于解析 HTML,现代的替代方案是 Document.parseHTMLUnsafe()。


-1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.