Show
Ignore:
Timestamp:
11/17/08 00:43:41 (5 years ago)
Author:
drry
Message:
Files:
1 copied

Legend:

Unmodified
Added
Removed
  • lang/javascript/document.write.dom/document.write.dom.2.js

    r23851 r23859  
    1 // Author: Naoki Okamura (Nyarla) <thotep@nyarla.net> 
    2 // This script is in the public domain. 
    3  
    4 (function () { 
    5  
    6 if ( typeof window.DOMParser == 'undefined' ) { 
     1/** 
     2 * Original author: Naoki Okamura (Nyarla) <thotep@nyarla.net> 
     3 * Adapter: drry 
     4 * This script is in the public domain. 
     5 */ 
     6(function() { 
     7  var appxhtml = "application/xhtml+xml"; 
     8  if (typeof window.DOMParser == "undefined" || 
     9      typeof document.contentType == "string" && 
     10      document.contentType != appxhtml) { 
    711    return; 
    8 } 
    9  
    10 var parser = new DOMParser; 
    11 var generateHTMLDOM = function ( text ) { 
    12     var div = '<div xmlns="http://www.w3.org/1999/xhtml">' + text + '</div>'; 
     12  } 
     13  var parser = new DOMParser; 
     14  var generateHTMLDOM = function(text) { 
     15    text = '<div xmlns="http://www.w3.org/1999/xhtml">' + text + "</div>"; 
    1316    var dom, root; 
    14  
    1517    try { 
    16         dom  = parser.parseFromString( div, 'application/xhtml+xml' ); 
    17         root = dom.documentElement; 
     18      dom  = parser.parseFromString(text, appxhtml); 
     19      root = dom.documentElement; 
     20    } catch (e) { 
     21      return null; 
    1822    } 
    19     catch ( e ) { 
    20         return false; 
     23    if (root.nodeName == "parsererror") { 
     24      return null; 
    2125    } 
    22  
    23     if ( root.nodeName == 'parsererror' ) { 
    24         return false; 
    25     } 
    26  
    2726    return root; 
    28 }; 
    29  
    30 var buffer   = []; 
    31 var lastNode = false; 
    32  
    33 var getReferenceNode = function ( node ) { 
    34     if ( node && node.nodeName && node.nodeName == 'script' ) { 
    35         return node; 
     27  }; 
     28  var lastNode         = null; 
     29  var getReferenceNode = function(node) { 
     30    if (node && node.nodeName && node.nodeName == "script") { 
     31      return node; 
    3632    } 
    3733    var element; 
    38     if ( node.lastChild ) element = arguments.callee( node.lastChild ); 
    39  
    40     if ( element ) { 
    41         return element; 
     34    if (node.lastChild && (element = arguments.callee(node.lastChild))) { 
     35      return element; 
    4236    } 
    4337    return lastNode; 
    44 }; 
    45  
    46 var writeHTML = function ( content, refNode ) { 
    47     if ( lastNode && lastNode != refNode ) { 
    48         refNode = lastNode; 
     38  }; 
     39  var buffer    = []; 
     40  var writeHTML = function(contents, refNode) { 
     41    if (lastNode && lastNode != refNode) { 
     42      refNode = lastNode; 
    4943    } 
    50  
    51     buffer = buffer.concat( content ); 
    52     var dom = generateHTMLDOM( buffer.join( '' ) ); 
    53     var parent; 
    54  
    55     if ( dom ) { 
    56         buffer = []; 
    57         parent = refNode.parentNode; 
    58         Array.prototype.slice.call( dom.childNodes ).forEach( function ( node ) { 
    59             if ( !node ) return; 
    60  
    61             parent.insertBefore( node, refNode.nextSibling ); 
    62             refNode = node; 
    63         } ); 
     44    buffer = buffer.concat(contents); 
     45    var dom = generateHTMLDOM(buffer.join("")); 
     46    var parent, node, length, i = 0; 
     47    if (dom) { 
     48      buffer = []; 
     49      parent = refNode.parentNode; 
     50      length = dom.childNodes.length; 
     51      while (i < length) { 
     52        if (node = dom.childNodes.item(i++).cloneNode(true)) { 
     53          parent.insertBefore(node, refNode.nextSibling); 
     54          refNode = node; 
     55        } 
     56      } 
    6457    } 
    65  
    6658    lastNode = refNode; 
    67  
    68     return; 
    69 }; 
    70  
    71 document.write = function () { 
    72     var content = Array.prototype.slice.call( arguments ); 
    73     writeHTML( content, getReferenceNode( document ) ); 
    74 }; 
    75  
    76 document.writeln = function () { 
    77     var content = Array.prototype.slice.call( arguments ); 
    78     content[content.length] = '\n'; 
    79     writeHTML( content, getReferenceNode( document ) ); 
    80 }; 
    81  
     59  }; 
     60  document.write = function() { 
     61    writeHTML(Array.prototype.slice.call(arguments), 
     62              getReferenceNode(document)); 
     63  }; 
     64  document.writeln = function() { 
     65    writeHTML(Array.prototype.slice.call(arguments).concat("\n"), 
     66              getReferenceNode(document)); 
     67  }; 
    8268})();