2016-10-11 6 views
13

あなたがMDNからDOMParserにの例を見れば:新しい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インスタンスを作成しておきます。しかし、なぜ? 1つのパーサーインスタンスで十分ではないでしょうか?多くの解析を行うコードでは、新しいインスタンスを作成する際にパフォーマンス上の利点はありますか?

EDIT:この例では、人々がハングアップしています。私の質問をよりよくフレーズするには なぜDOMParserJSONとそのparseのようになりますか? parseFromStringはなぜ静的メソッドではありませんか?

+8

私はこれを3つの別々の例として、励ましとして解釈しません解析操作ごとに新しいパーサーを作成します。 –

+0

多分、私は '(新しいDOMParser).parseFromString'を行うコードを見ています。私はそれが便利だと思いますが、なぜこのインターフェースを持っていても、DOMParserインスタンスにはどのような状態も保持されていますか?私は[spec](https://w3c.github.io/DOM-Parsing/#dom-domparser)を少し見ましたが、その理由を見つけることができませんでした。 – kasbah

+0

現在、DOMParserオブジェクトとXMLSerializerオブジェクトの両方にはメソッドが1つしかありませんが、コンストラクタを使用すると、必要に応じて将来追加することができます。 – Kaiido

答えて

4

あなたが投稿した例は、1つに連結された3つの異なる例であり、すべてが新しいDOMParserを宣言するので、それぞれが単独で実行可能です。

多分、私はそれを回避するために多くのコードを見ています(新しい DOMParser).parseFromString。

(new DOMParser()).parseFromStringは、1度しか使用しないため、他の場所では必要ないため、別の変数を作成することは冗長です。

このコード:

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のためにこのインターフェイスを選択したのですか?それは意味をなさない。それはステートレスな関数である1つのメソッドを持っています。 – kasbah

+1

@kasbah 1。)JavaScriptはオブジェクト指向になりたい2.)現在の拡張機能(WebKitなど)に依存するため。 –

0

MIMEタイプがtext/xmlの場合、結果のオブジェクトはXMLDocumentになります。MIMEタイプがimage/svg + xmlの場合はSVGDocumentになり、MIMEタイプがtext/htmlの場合はHTMLDocument

だから、その約1パーサのインスタンスが、その私たちが必要なものについて...

あなたが投稿の例では、1に連結わずか3別の例ではない、と彼らはすべての新しいDOMParserを宣言します。

また、1つのパーサーインスタンスで行うこともできますが、正確な要件に応じてparseFromStringメソッドでMIMEタイプを変更するだけで済みます。これらのすべてが必要な場合は、同じパーサーインスタンスで異なるMIMEタイプの3つのparseFromStringメソッドを呼び出す必要があります。

関連する問題