2016-10-11 15 views
13

Eğer MDN gelen DOMParser örneğinde bakarsak:Yeni DOMParser örneklerinin oluşturulma noktası nedir?

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. 

Onlar new DOMParser örnekleri oluştururken tutun. Ama neden? Bir ayrıştırıcı örneği yeterli olmaz mıydı? Çok fazla ayrıştırma yapan kod hakkında, yeni örnekler oluştururken performans avantajı var mı?

DÜZENLEME: İnsanlar örnek üzerinde asılı kalıyor. Sorumu daha iyi ifade etmek için: neden DOMParserJSON ve onun parse yöntemine benzemiyor? Neden parseFromString statik bir yöntem değil?

+8

Bunu bir 'teşvik' olarak değil, 3 'ayrı' örnek olarak yorumluyorum. Her ayrıştırma işlemi için yeni bir ayrıştırıcı oluşturmak. –

+0

Belki, ama genellikle bu konuda çok fazla kod görüyorum '(yeni DOMParser) .parseFromString'. Sanırım bu kolaylık içindir, ancak neden bu arabirime sahip olsa da, DOMParser örneğinizde tutulan herhangi bir durum var mı? Ben [spec] baktım (https://w3c.github.io/DOM-Parsing/#dom-domparser) biraz ama bunun için bir neden bulamadı. – kasbah

+0

Şu anda hem DOMParser hem de XMLSerializer Nesnelerinin yalnızca bir yöntemi vardır, ancak bir kurucunun kullanılması gerekirse daha fazla eklemeye olanak tanır. – Kaiido

cevap

4

Gönderdiğiniz örnek, 1 ile birleştirilmiş 3 farklı örnektir ve hepsi yeni bir DOMParser bildirir, böylece her biri kendi başına çalışır durumda olabilir.

Belki, ama genelde Bunu yapan (yeni DOMParser) .parseFromString etrafında bir sürü kod görüyoruz.

onlar sadece bir kez kullanmak ve onlar da gereksiz için böylece ayrı bir değişken oluşturup, başka bir yerde buna ihtiyacı yoktur, çünkü olduğunu (new DOMParser()).parseFromString kullanın.

Bu kod: Tarayıcı DOMParser nesneyi desteklemiyorsa

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); 
    } 
}; 

Bu hemen hemen bir arızaya karşı güvenlidir.

+0

Sorum şu oldu: neden tasarımcılar DOMParser için bu arayüzü seçtiler? Hiçbir anlamı yok. Vatansız bir işlev olan bir yöntem vardır. – kasbah

+1

@kasbah 1.) JavaScript nesne yönelimli olmak ister. 2.) Mevcut uzantıya (WebKit gibi) bağlı olduğundan. –

0

MIME türü, text/xml ise, sonuç MIME tipi image/svg + xml ise, bir XMLDocument olur; bu bir SVGDocument olur ve MIME türü text/html ise, bir HTMLDocument.

Yani onun değil yaklaşık bir ayrıştırıcı örneği ama onun ne biz gerekli ...

Yayınladığınız örnek sadece 3 farklı örnekler 1 içine birleştirilmiş ve hepsi yeni DOMParser beyan hakkında.

Aynı zamanda bir çözümleyici örneği tarafından da yapabilirsiniz, ancak tam gereksiniminize göre parseFromString yönteminde MIME türünü değiştirmeniz yeterlidir. Ve tüm bunlara ihtiyacınız varsa, o zaman, parseFromString'i, aynı ayrıştırıcı örneği tarafından 3 kez farklı MIME türü ile mehod olarak çağırmalısınız. Bu, size yardımcı olacaktır ..