2012-02-12 9 views
16

मैं डोम में एक स्ट्रिंग पार्स करने के लिए निम्न कोड का उपयोग कर रहा:जावास्क्रिप्ट DOMParser पहुँच innerHTML और अन्य गुण

var doc new DOMParser().parseFromString(string, 'text/xml'); 

कहाँ string सिर्फ <!DOCTYPE html><html><head></head><body>content</body></html> की तरह कुछ है।

typeof doc मुझे object देता है। अगर मैं doc.querySelector('body') जैसा कुछ करता हूं तो मुझे एक DOM ऑब्जेक्ट वापस मिलता है। लेकिन अगर मैं की तरह आप सामान्य रूप से कर सकते हैं, किसी भी गुण तक पहुँचने का प्रयास, यह मेरे देता undefined:

doc.querySelector('body').innerHTML; // undefined 

ही अन्य संपत्तियों, उदा लिए चला जाता है id। दूसरी ओर विशेषता पुनर्प्राप्ति doc.querySelector('body').getAttribute('id'); ठीक हो जाती है।

क्या उन गुणों तक पहुंचने के लिए कोई जादू कार्य है?

उत्तर

32

आपकी वर्तमान विधि विफल हो जाती है, क्योंकि HTML गुणों को दिए गए XML दस्तावेज़ के लिए परिभाषित नहीं किया गया है। यदि आप text/html MIME-type की आपूर्ति करते हैं, तो विधि को काम करना चाहिए।

var string = '<!DOCTYPE html><html><head></head><body>content</body></html>'; 
var doc = new DOMParser().parseFromString(string, 'text/html'); 
doc.body.innerHTML; // or doc.querySelector('body').innerHTML 
//^Returns "content" 

कोड नीचे ब्राउज़रों जो मूल रूप से अभी तक इसका समर्थन नहीं करते के लिए text/html माइम प्रकार सक्षम बनाता है। Mozilla Developer Network से लिया गया है:

/* 
* DOMParser HTML extension 
* 2012-02-02 
* 
* By Eli Grey, http://eligrey.com 
* Public domain. 
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. 
*/ 

/*! @source https://gist.github.com/1129031 */ 
/*global document, DOMParser*/ 

(function(DOMParser) { 
    "use strict"; 
    var DOMParser_proto = DOMParser.prototype 
     , real_parseFromString = DOMParser_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) {} 

    DOMParser_proto.parseFromString = function(markup, type) { 
     if (/^\s*text\/html\s*(?:;|$)/i.test(type)) { 
      var doc = document.implementation.createHTMLDocument("") 
       , doc_elt = doc.documentElement 
       , first_elt; 

      doc_elt.innerHTML = markup; 
      first_elt = doc_elt.firstElementChild; 

      if (doc_elt.childElementCount === 1 
       && first_elt.localName.toLowerCase() === "html") { 
       doc.replaceChild(first_elt, doc_elt); 
      } 

      return doc; 
     } else { 
      return real_parseFromString.apply(this, arguments); 
     } 
    }; 
}(DOMParser)); 
+3

पी एस। स्पष्टीकरण के लिए, जब आप 'text/xml' का उपयोग कर रहे हैं, तो 'doc'' XMDocument' का एक उदाहरण है। 'टेक्स्ट/एचटीएमएल' का प्रयोग करके, यह 'HTMLDocument' का एक उदाहरण है। –

+0

वाउ, काफी उपयोगी जवाब! वह खुद को नहीं मिला। बस माइम प्रकार और उस माइम प्रकार को सक्षम करने :) – DADU

+1

@RobW मुझे लगता है कि आपका मतलब 'XMLDocument' है। पॉलीफिल के लिंक के लिए – devios1

0

उपयोग element.getAttribute(attributeName) एक्सएमएल के लिए/HTML तत्वों

संबंधित मुद्दे