【问题标题】:What is the point of creating new DOMParser instances?创建新的 DOMParser 实例有什么意义?
【发布时间】:2017-02-20 00:13:27
【问题描述】:

如果你从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 个“单独的”示例,而不是鼓励为每个解析操作创建一个新的解析器。
  • 也许吧,但通常我看到很多代码都在 (new DOMParser).parseFromString 周围。我想这是为了方便,但为什么它甚至有这个接口,你的 DOMParser 实例中是否保存了任何状态?我看了spec一点,但找不到原因。
  • 目前 DOMParser 和 XMLSerializer 对象都只有一个方法,但是如果需要,使用构造函数可以在将来添加更多。
  • 你有没有试过询问页面的作者?
  • @Kalido,如果它不是一个类,我不明白为什么他们不能在以后添加更多方法。如果它更像JSON.parse,对我来说是有意义的。我认为这可能是有原因的,但似乎没有。 @guest271314 我更感兴趣的是为什么 DOMParser 有这个接口。

标签: javascript domparser


【解决方案1】:

您发布的示例只是 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 对象,这几乎是一种故障保护。

【讨论】:

  • 我的问题是:为什么设计者要为 DOMParser 选择这个接口?这没有任何意义。它有一种方法是无状态函数。
  • @kasbah 1.) JavaScript 想要面向对象 2.) 因为它依赖于当前的扩展(如 WebKit)。
【解决方案2】:

如果 MIME 类型为 text/xml,则生成的对象将为 XMLDocument,如果 MIME 类型为 image/svg+xml,则为 SVGDocument,如果 MIME 类型为 text/html,则为HTML 文档。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2017-10-21
    • 2021-06-21
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多