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

发布于 2024-08-11 16:58:26 字数 343 浏览 6 评论 0原文

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

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

应该产生:

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

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

Javascript: I have the DOM representation of a node (element or document) and I'm looking for the string representation of it. E.g.,

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

should yield:

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

I have the strong feeling, that I'm missing something trivially simple, but I just don't find a method that works in IE, FF, Safari and Opera. Therefore, outerHTML is no option.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

蘸点软妹酱 2024-08-18 16:58:26

您可以创建一个临时父节点,并获取其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 应该就是所需要的。

You can create a temporary parent node, and get the innerHTML content of it:

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>

EDIT:
Please see answer below about outerHTML. el.outerHTML should be all that is needed.

此刻的回忆 2024-08-18 16:58:26

您正在寻找的是“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 插件:获取所选元素的外部 HTML

What you're looking for is 'outerHTML', but we need a fallback because it's not compatible with old browsers.

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>"

You'll find my jQuery plugin here: Get selected element's outer HTML

赠佳期 2024-08-18 16:58:26

我认为您不需要任何复杂的脚本。只需使用

get_string=(el)=>el.outerHTML;

I dont think you need any complicated script for this. Just use

get_string=(el)=>el.outerHTML;
娇纵 2024-08-18 16:58:26

在 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;
   }
}

Under FF you can use the XMLSerializer object to serialize XML into a string. IE gives you an xml property of a node. So you can do the following:

function xml2string(node) {
   if (typeof(XMLSerializer) !== 'undefined') {
      var serializer = new XMLSerializer();
      return serializer.serializeToString(node);
   } else if (node.xml) {
      return node.xml;
   }
}
(り薆情海 2024-08-18 16:58:26

使用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

Use Element#outerHTML:

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

console.log(el.outerHTML);

It can also be used to write DOM elements. From Mozilla's documentation:

The outerHTML attribute of the element DOM interface gets the serialized HTML fragment describing the element including its descendants. It can be set to replace the element with nodes parsed from the given string.

https://developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML

木緿 2024-08-18 16:58:26

尝试

new XMLSerializer().serializeToString(element);

Try

new XMLSerializer().serializeToString(element);
灼痛 2024-08-18 16:58:26

您可以简单地在元素上使用 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

You can simply use outerHTML property over the element. It will return what you desire.

Let's create a function named 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

过度放纵 2024-08-18 16:58:26

使用 element.outerHTML 获取元素的完整表示,包括外部标签和属性。

Use element.outerHTML to get full representation of element, including outer tags and attributes.

情仇皆在手 2024-08-18 16:58:26

如果你的元素有父元素

element.parentElement.innerHTML

If your element has parent

element.parentElement.innerHTML
夜雨飘雪 2024-08-18 16:58:26

我发现对于我的用例,我并不总是需要整个outerHTML。许多节点有太多的子节点无法显示。

这是一个函数(在 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< /a>

I've found that for my use-cases I don't always want the entire outerHTML. Many nodes just have too many children to show.

Here's a function (minimally tested in 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

失去的东西太少 2024-08-18 16:58:26

当我使用接受的答案中的代码迭代 DOMElements 时,我浪费了很多时间来找出问题所在。这对我有用,否则每隔一个元素就会从文档中消失:

_getGpxString: function(node) {
          clone = node.cloneNode(true);
          var tmp = document.createElement("div");
          tmp.appendChild(clone);
          return tmp.innerHTML;
        },

I have wasted a lot of time figuring out what is wrong when I iterate through DOMElements with the code in the accepted answer. This is what worked for me, otherwise every second element disappears from the document:

_getGpxString: function(node) {
          clone = node.cloneNode(true);
          var tmp = document.createElement("div");
          tmp.appendChild(clone);
          return tmp.innerHTML;
        },
猫弦 2024-08-18 16:58:26

虽然 outerHTML 通常是答案,但对于 AttrTextNode 接口的子类),有其他属性:

(<Element>x).outerHTML
(<Text>x).data
(<Attr>x).value;

请参阅 https://developer.mozilla.org/en- US/docs/Web/API/Node 用于更多类型的节点,例如 DocumentFragmentComment

While outerHTML is usually the answer, for Attr and Text(Child classes of the Node interface), there are other properties:

(<Element>x).outerHTML
(<Text>x).data
(<Attr>x).value;

See https://developer.mozilla.org/en-US/docs/Web/API/Node for more types of Nodes such as DocumentFragment and Comment

喵星人汪星人 2024-08-18 16:58:26

如果使用反应:

const html = ReactDOM.findDOMNode(document.getElementsByTagName('html')[0]).outerHTML;

if using react:

const html = ReactDOM.findDOMNode(document.getElementsByTagName('html')[0]).outerHTML;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文