function(fragmentStr) {
            // "Let node the context object's start's node."
            var node = this.startContainer;
            var doc = dom.getDocument(node);

            // "If the context object's start's node is null, raise an INVALID_STATE_ERR
            // exception and abort these steps."
            if (!node) {
                throw new DOMException("INVALID_STATE_ERR");
            }

            // "Let element be as follows, depending on node's interface:"
            // Document, Document Fragment: null
            var el = null;

            // "Element: node"
            if (node.nodeType == 1) {
                el = node;

            // "Text, Comment: node's parentElement"
            } else if (dom.isCharacterDataNode(node)) {
                el = dom.parentElement(node);
            }

            // "If either element is null or element's ownerDocument is an HTML document
            // and element's local name is "html" and element's namespace is the HTML
            // namespace"
            if (el === null || (
                el.nodeName == "HTML"
                && dom.isHtmlNamespace(dom.getDocument(el).documentElement)
                && dom.isHtmlNamespace(el)
            )) {

            // "let element be a new Element with "body" as its local name and the HTML
            // namespace as its namespace.""
                el = doc.createElement("body");
            } else {
                el = el.cloneNode(false);
            }

            // "If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm."
            // "If the node's document is an XML document: Invoke the XML fragment parsing algorithm."
            // "In either case, the algorithm must be invoked with fragment as the input
            // and element as the context element."
            el.innerHTML = fragmentStr;

            // "If this raises an exception, then abort these steps. Otherwise, let new
            // children be the nodes returned."

            // "Let fragment be a new DocumentFragment."
            // "Append all new children to fragment."
            // "Return fragment."
            return dom.fragmentFromNodeChildren(el);
        }
function(fragmentStr) {
            
            var node = this.startContainer;
            var doc = dom.getDocument(node);

            
            
            if (!node) {
                throw new DOMException("INVALID_STATE_ERR");
            }

            
            
            var el = null;

            
            if (node.nodeType == 1) {
                el = node;

            
            } else if (dom.isCharacterDataNode(node)) {
                el = dom.parentElement(node);
            }

            
            
            
            if (el === null || (
                el.nodeName == "HTML"
                && dom.isHtmlNamespace(dom.getDocument(el).documentElement)
                && dom.isHtmlNamespace(el)
            )) {

            
            
                el = doc.createElement("body");
            } else {
                el = el.cloneNode(false);
            }

            
            
            
            
            el.innerHTML = fragmentStr;

            
            

            
            
            
            return dom.fragmentFromNodeChildren(el);
        }
function ( fragmentStr ) { // "Let node the context object's start's node." var node = this . startContainer ; var doc = dom . getDocument ( node ) ; // "If the context object's start's node is null, raise an INVALID_STATE_ERR // exception and abort these steps." if ( ! node ) { throw new DOMException ( "INVALID_STATE_ERR" ) ; } // "Let element be as follows, depending on node's interface:" // Document, Document Fragment: null var el = null ; // "Element: node" if ( node . nodeType == 1 ) { el = node ; // "Text, Comment: node's parentElement" } else if ( dom . isCharacterDataNode ( node ) ) { el = dom . parentElement ( node ) ; } // "If either element is null or element's ownerDocument is an HTML document // and element's local name is "html" and element's namespace is the HTML // namespace" if ( el === null || ( el . nodeName == "HTML" && dom . isHtmlNamespace ( dom . getDocument ( el ) . documentElement ) && dom . isHtmlNamespace ( el ) ) ) { // "let element be a new Element with "body" as its local name and the HTML // namespace as its namespace."" el = doc . createElement ( "body" ) ; } else { el = el . cloneNode ( false ) ; } // "If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm." // "If the node's document is an XML document: Invoke the XML fragment parsing algorithm." // "In either case, the algorithm must be invoked with fragment as the input // and element as the context element." el . innerHTML = fragmentStr ; // "If this raises an exception, then abort these steps. Otherwise, let new // children be the nodes returned." // "Let fragment be a new DocumentFragment." // "Append all new children to fragment." // "Return fragment." return dom . fragmentFromNodeChildren ( el ) ; }
Implementation as per HTML parsing spec, trusting in the browser's implementation of innerHTML. See discussion and base code for this implementation at issue 67. Spec: http://html5.org/specs/dom-parsing.html#extensions-to-the-range-interface Thanks to Aleks Williams.
Implementation as per HTML parsing spec trusting in the browser s implementation of innerHTML . See discussion and base code for this implementation at issue 67 . Spec : http : // html5 . org / specs / dom - parsing . html#extensions - to - the - range - interface Thanks to Aleks Williams .