Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript DOMParser access innerHTML and other properties

I am using the following code to parse a string into DOM:

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

Where string is something like <!DOCTYPE html><html><head></head><body>content</body></html>.

typeof doc gives me object. If I do something like doc.querySelector('body') I get a DOM object back. But if I try to access any properties, like you normally can, it gives me undefined:

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

The same goes for other properties, e.g. id. The attribute retrieval on the other hand goes fine doc.querySelector('body').getAttribute('id');.

Is there a magic function to have access to those properties?

like image 814
DADU Avatar asked Feb 12 '12 16:02

DADU


People also ask

When to use innerHTML?

innerHTML is useful at any time to insert new HTML tags/content as a string, and can be more easily directed to specific elements in the DOM regardless of when/where the JavaScript is run.

How to insert innerHTML?

To append using the innerHTML attribute, first select the element (div) where you want to append the code. Then, add the code enclosed as strings using the += operator on innerHTML.

Is innerHTML safe?

'innerHTML' Presents a Security RiskThe use of innerHTML creates a potential security risk for your website. Malicious users can use cross-site scripting (XSS) to add malicious client-side scripts that steal private user information stored in session cookies. You can read the MDN documentation on innerHTML .


1 Answers

Your current method fails, because HTML properties are not defined for the given XML document. If you supply the text/html MIME-type, the method should work.

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" 

The code below enables the text/html MIME-type for browsers which do not natively support it yet. Is retrieved from the 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)); 
like image 129
Rob W Avatar answered Sep 27 '22 23:09

Rob W