2016-10-11 4 views
13

Если посмотреть на пример DomParser из 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 статический метод?

+8

Я бы это интерпретировал как «отдельные» примеры, а не как поощрение для создания нового анализатора для каждой операции синтаксического анализа. –

+0

Возможно, но, как правило, я вижу много кода, который делает '(новый DOMParser) .parseFromString'. Думаю, это для удобства, но почему у этого даже есть этот интерфейс, какое-либо состояние хранится в вашем экземпляре DOMParser? Я немного посмотрел на [spec] (https://w3c.github.io/DOM-Parsing/#dom-domparser), но не смог найти причину. – kasbah

+0

В настоящее время оба объекта DOMParser и XMLSerializer имеют только один метод, но использование конструктора позволяет при необходимости добавить больше в будущем. – Kaiido

ответ

4

Пример, который вы опубликовали, представляет собой всего 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

Мой вопрос был действительно: почему дизайнеры выбрали этот интерфейс для DOMParser? Это не имеет никакого смысла. Он имеет один метод, который является функцией без гражданства. – kasbah

+1

@kasbah 1.) JavaScript хочет быть объектно ориентированным. 2.) Потому что это зависит от текущего расширения (например, WebKit). –

0

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

Таким образом, ее не об один парсер экземпляр, но его о том, что мы требовали ...

Пример вы вывесили это всего 3 различные примеры объединены в 1, и все они объявляют новый DomParser.

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

Смежные вопросы