You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.9 KiB
75 lines
1.9 KiB
/* |
|
* outerHTML.js |
|
* Cross-browser full HTMLElement.outerHTML implementation. |
|
* |
|
* 2011-11-14 |
|
* |
|
* By Eli Grey, http://eligrey.com |
|
* Public Domain. |
|
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. |
|
*/ |
|
|
|
if (typeof document !== "undefined" && !("outerHTML" in document.createElementNS("http://www.w3.org/1999/xhtml", "_"))) { |
|
|
|
(function(view) { |
|
"use strict"; |
|
|
|
var |
|
container = document.createElementNS("http://www.w3.org/1999/xhtml", "_") |
|
, elem_proto = (view.HTMLElement || view.Element).prototype |
|
, xml_serializer = new XMLSerializer |
|
, outerHTML_getter = function() { |
|
var |
|
node = this |
|
, html |
|
; |
|
if (document.xmlVersion) { |
|
return xml_serializer.serializeToString(node); |
|
} else { |
|
container.appendChild(node.cloneNode(false)); |
|
html = container.innerHTML.replace("><", ">" + node.innerHTML + "<"); |
|
container.innerHTML = ""; |
|
return html; |
|
} |
|
} |
|
, outerHTML_setter = function(html) { |
|
var |
|
node = this |
|
, parent = node.parentNode |
|
, child |
|
; |
|
if (parent === null) { |
|
DOMException.code = DOMException.NOT_FOUND_ERR; |
|
throw DOMException; |
|
} |
|
container.innerHTML = html; |
|
while ((child = container.firstChild)) { |
|
parent.insertBefore(child, node); |
|
} |
|
parent.removeChild(node); |
|
} |
|
; |
|
|
|
if (Object.defineProperty) { |
|
var outerHTML_prop_desc = { |
|
get: outerHTML_getter |
|
, set: outerHTML_setter |
|
, enumerable: true |
|
, configurable: true |
|
}; |
|
try { |
|
Object.defineProperty(elem_proto, "outerHTML", outerHTML_prop_desc); |
|
} catch (ex) { // IE 8 doesn't support enumerable:true |
|
if (ex.number === -0x7FF5EC54) { |
|
outerHTML_prop_desc.enumerable = false; |
|
Object.defineProperty(elem_proto, "outerHTML", outerHTML_prop_desc); |
|
} |
|
} |
|
} else if (Object.prototype.__defineGetter__ && Object.prototype.__defineSetter__) { |
|
elem_proto.__defineGetter__("outerHTML", outerHTML_getter); |
|
elem_proto.__defineSetter__("outerHTML", outerHTML_setter); |
|
} |
|
|
|
}(self)); |
|
|
|
}
|