Подтвердить что ты не робот

Какой смысл создавать новые экземпляры DOMParser?

Если вы посмотрите на пример DOMParser из MDN:

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 статический метод?

4b9b3361

Ответ 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.

Ответ 2

Если тип MIME является text/xml, результирующий объект будет XMLDocument, если тип MIME - image/svg + xml, он будет SVGDocument, и если тип MIME - text/html, это будет HTMLDocument.

Значит, это не один экземпляр парсера, а его то, что нам нужно...

Пример, который вы опубликовали, представляет собой всего 3 разных примера, объединенных в 1, и все они объявляют новый DOMParser.

Вы можете сделать это и одним экземпляром парсера, но вам просто нужно изменить тип MIME в методе parseFromString в соответствии с вашим точным требованием. И если вам нужно все это, тогда вам нужно вызвать parseFromString mehod с другим типом MIME 3 раза одним экземпляром парсера. Надеюсь, это поможет вам.