获取DOM节点的字符串表示形式

时间:2009-11-17 18:26:51

标签: javascript string dom cross-browser element

Javascript:我有一个节点(元素或文档)的DOM表示,我正在寻找它的字符串表示。如,

var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));

应该产生:

get_string(el) == "<p>Test</p>";

我有强烈的感觉,我错过了一些简单的东西,但我找不到一种适用于IE,FF,Safari和Opera的方法。因此,outerHTML是没有选择的。

12 个答案:

答案 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
enter image description here

答案 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;