Какой смысл создавать новые экземпляры 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
статический метод?
Ответы
Ответ 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 раза одним экземпляром парсера. Надеюсь, это поможет вам.