為了屏蔽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(""); }
<br /><!doctype html><br /><html><br /> <head><br /> <title>outerHTML與innerHTML by 司徒正美</title><br /> <meta charset="utf-8"/><br /> <meta content="IE=8" http-equiv="X-UA-Compatible"/><br /> <meta name="keywords" content="outerHTML與innerHTML by 司徒正美" /><br /> <meta name="description" content="outerHTML與innerHTML by 司徒正美" /></p><p> <script type="text/javascript" charset="utf-8"></p><p> window.onload = function(){</p><p> if(!String.prototype.trim){<br /> String.prototype.trim = function(str){<br /> return this.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');<br /> }<br /> }</p><p> var metaObject = {<br /> '\b': '\\b',<br /> '\t': '\\t',<br /> '\n': '\\n',<br /> '\f': '\\f',<br /> '\r': '\\r',<br /> '\\': '\\\\'<br /> }<br /> if(!String.prototype.quote ){<br /> String.prototype.quote = function () {<br /> str = this.replace(/[\x00-\x1f\\]/g, function (chr) {<br /> var special = metaObject[chr];<br /> return special ? special : '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4)<br /> });<br /> return '"' + str.replace(/"/g, '\\"') + '"';<br /> }<br /> }<br /> if(document.documentElement.__defineGetter__){<br /> HTMLElement.prototype.__defineGetter__("currentStyle", function () {<br /> return this.ownerDocument.defaultView.getComputedStyle(this, null);<br /> });<br /> }<br /> var rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i;<br /> var outerHTML = function(el,recursion){<br /> switch(el.nodeType+""){<br /> case "1":<br /> var array = [];<br /> var nodeName = el.nodeName;<br /> if(recursion && el.currentStyle.display == "block"){<br /> array.push("\n")<br /> }<br /> array.push("<"+nodeName);<br /> for(var i=0,t;t=el.attributes[i++];){<br /> array.push(" "+t.name+"="+(t.value||t.specified+"").quote())<br /> }<br /> if(rselfClosing.test(el.nodeName)){<br /> array.push("\/>")<br /> }else{<br /> array.push(">");<br /> for(var i=0,c;c=el.childNodes[i++];){<br /> array.push(outerHTML(c,true))<br /> }<br /> array.push("<\/"+el.nodeName+">")<br /> }<br /> return array.join("");<br /> case "3":<br /> return el.nodeValue.trim();<br /> case "8":<br /> return "innerHTML" in el? el.innerHTML : "<!--"+el.nodeValue+"-->"<br /> }<br /> }<br /> var innerHTML = function(el){<br /> var array = [];<br /> for(var i=0,c;c=el.childNodes[i++];){<br /> array.push(outerHTML(c,true))<br /> }<br /> return array.join("");<br /> }</p><p> var div = document.getElementById("aaa");<br /> var radio = document.getElementsByTagName("input")[0];<br /> radio.value = "aaa";<br /> alert(outerHTML(div))<br /> alert(innerHTML(div))<br /> alert(outerHTML(radio))<br /> }<br /> </script></p><p> </head><br /> <body><br /> <div id="aaa" idd="bbb" onclick="alert('222')" style="border:1px solid red"> outerHTML與innerHTML by 司徒正美<br /> <p pp="pp">outerHTML與innerHTML</p><!-- 注釋 //--></div><br /> <form><br /> <input type="radio" checked><br /> </form></p><p> </body><br /></html><br />
運行代碼
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("]*)>/);
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("")
}
return array.join("");
case "3":
return el.nodeValue.trim();
case "8":
return "innerHTML" in el? el.innerHTML : ""
}
},