Javascript:我有一个节点(元素或文档)的DOM表示,我正在寻找它的字符串表示。如,
var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));
应该产生:
get_string(el) == "<p>Test</p>";
我有强烈的感觉,我错过了一些简单的东西,但我找不到一种适用于IE,FF,Safari和Opera的方法。因此,outerHTML是没有选择的。
答案 0 :(得分:113)
您可以创建一个临时父节点,并获取它的innerHTML内容:
var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));
var tmp = document.createElement("div");
tmp.appendChild(el);
console.log(tmp.innerHTML); // <p>Test</p>
修改强> 请参阅下面有关outerHTML的答案。 el.outerHTML应该是所有需要的。
答案 1 :(得分:38)
你要找的是'outerHTML',但我们需要一个后备因素,因为它与旧的浏览器不兼容。
var getString = (function() {
var DIV = document.createElement("div");
if ('outerHTML' in DIV)
return function(node) {
return node.outerHTML;
};
return function(node) {
var div = DIV.cloneNode();
div.appendChild(node.cloneNode(true));
return div.innerHTML;
};
})();
// getString(el) == "<p>Test</p>"
你会在这里找到我的jQuery插件:Get selected element's outer HTML
答案 2 :(得分:15)
在FF下,您可以使用XMLSerializer
对象将XML序列化为字符串。 IE为您提供节点的xml
属性。所以你可以做到以下几点:
function xml2string(node) {
if (typeof(XMLSerializer) !== 'undefined') {
var serializer = new XMLSerializer();
return serializer.serializeToString(node);
} else if (node.xml) {
return node.xml;
}
}
答案 3 :(得分:13)
我认为你不需要任何复杂的脚本。只需使用
get_string=(el)=>el.outerHTML;
答案 4 :(得分:6)
使用Element#outerHTML:
var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));
console.log(el.outerHTML);
它也可以用来编写DOM元素。来自Mozilla的文档:
元素DOM接口的outerHTML属性获取描述元素(包括其后代)的序列化HTML片段。可以将其设置为使用从给定字符串解析的节点替换元素。
https://developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML
答案 5 :(得分:3)
使用element.outerHTML获取元素的完整表示,包括外部标记和属性。
答案 6 :(得分:1)
如果您的元素有父
element.parentElement.innerHTML
答案 7 :(得分:1)
尝试
new XMLSerializer().serializeToString(element);
答案 8 :(得分:1)
您可以简单地在元素上使用 outerHTML 属性。它会返回你想要的。
让我们创建一个名为 get_string(element)
var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));
function get_string(element) {
console.log(element.outerHTML);
}
get_string(el); // your desired output
答案 9 :(得分:0)
当我用接受的答案中的代码迭代DOMElements时,我浪费了很多时间来弄清楚出了什么问题。这对我有用,否则每一个元素都会从文档中消失:
_getGpxString: function(node) {
clone = node.cloneNode(true);
var tmp = document.createElement("div");
tmp.appendChild(clone);
return tmp.innerHTML;
},
答案 10 :(得分:0)
我发现对于我的用例,我并不总是想要整个externalHTML。许多节点只是要显示太多子节点。
这是一个功能(已在Chrome中进行了至少测试):
/**
* Stringifies a DOM node.
* @param {Object} el - A DOM node.
* @param {Number} truncate - How much to truncate innerHTML of element.
* @returns {String} - A stringified node with attributes
* retained.
*/
function stringifyEl(el, truncate) {
var truncateLen = truncate || 50;
var outerHTML = el.outerHTML;
var ret = outerHTML;
ret = ret.substring(0, truncateLen);
// If we've truncated, add an elipsis.
if (outerHTML.length > truncateLen) {
ret += "...";
}
return ret;
}
https://gist.github.com/kahunacohen/467f5cc259b5d4a85eb201518dcb15ec
答案 11 :(得分:-1)
如果使用react:
const html = ReactDOM.findDOMNode(document.getElementsByTagName('html')[0]).outerHTML;