Ruby's Louvre

每天学习一点点算法

导航

outerHTML与innerHTML

为了屏蔽IE与标准浏览器之间鸿沟,特别搞了这个,而且连XML也能用了。

          if(!String.prototype.trim){
               String.prototype.trim = function(str){
                   return this.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
               }
         }
               
         var  metaObject = {
                    '\b': '\\b',
                    '\t': '\\t',
                    '\n': '\\n',
                    '\f': '\\f',
                    '\r': '\\r',
                    '\\': '\\\\'
         }
        if(!String.prototype.quote ){
           String.prototype.quote = function () {
                 str = this.replace(/[\x00-\x1f\\]/g, function (chr) {
                            var special = metaObject[chr];
                            return special ? special : '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4)
                 });
                  return '"' + str.replace(/"/g, '\\"') + '"';
             }
        }

        if(document.documentElement.__defineGetter__){
          HTMLElement.prototype.__defineGetter__("currentStyle", function () {
            return this.ownerDocument.defaultView.getComputedStyle(this, null);
          });
        }
        var rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i;
        var outerHTML = function(el,recursion){
          switch(el.nodeType+""){
            case "1":
              var array = [];
              var nodeName = el.nodeName;
              if(recursion && el.currentStyle.display == "block"){
                array.push("\n")
              }
              array.push("<"+nodeName);
              for(var i=0,t;t=el.attributes[i++];){
                array.push(" "+t.name+"="+(t.value||t.specified+"").quote())
              }
              if(rselfClosing.test(el.nodeName)){
                array.push("\/>")
              }else{
                array.push(">");
                for(var i=0,c;c=el.childNodes[i++];){
                  array.push(outerHTML(c,true))
                }
                array.push("<\/"+el.nodeName+">")
              }
              return array.join("");
            case "3":
              return el.nodeValue.trim();
            case "8":
              return "innerHTML" in el? el.innerHTML : "<!--"+el.nodeValue+"-->"
          }
        }
        var innerHTML = function(el){
          var array = [];
          for(var i=0,c;c=el.childNodes[i++];){
            array.push(outerHTML(c,true))
          }
          return array.join("");
        }

outerHTML = function(el,recursion){ dom.require("css"); switch(el.nodeType+""){ case "1": var array = []; var nodeName = el.nodeName; if(recursion && dom.getStyle(el,"display") == "block"){ array.push("\n") } array.push("<"+nodeName); if(dom.ie67 && el.outerHTML){ var a = el.outerHTML.match(/<(\w+)([^>]*)>/); if(a && a[2]){ array.push(" "+ a[2].trim().split(/\s+/).map(function(el){ var value = el.split("=")[1]; if(value.charAt(0)!=="\""){ el = el.replace(value,value.quote()); } return el; }).join(" ")); } }else{ for(var i=0,t;t=el.attributes[i++];){ array.push(" "+t.name+"="+(t.value||t.specified+"").quote()) } } if(rselfClosing.test(el.nodeName)){ array.push("\/>") }else{ array.push(">"); for(var i=0,c;c=el.childNodes[i++];){ array.push(outerHTML(c,true)) } array.push("<\/"+el.nodeName+">") } return array.join(""); case "3": return el.nodeValue.trim(); case "8": return "innerHTML" in el? el.innerHTML : "" } },

posted on 2010-05-30 22:01  司徒正美  阅读(2020)  评论(0编辑  收藏  举报