【问题标题】:returning element altered by outerHTML返回由 outerHTML 更改的元素
【发布时间】:2017-06-16 15:00:54
【问题描述】:

我通过

创建了一个通用元素
var element = document.createElement(null);
document.body.appendChild(element);

之后,使用outerHTML改变元素

element.outerHTML = "<div> hello there </div>";

元素正确显示。然而,变量本身的“元素”并没有以任何方式反映变化。检索该特定元素的唯一方法似乎是执行类似...

element.outerHTML = "<div id='hi'> hello there </div>";
element = document.getElementById("hi");

看起来很丑。有没有更好的方法和/或我错过了什么?

【问题讨论】:

  • 我们有一个全新的replaceWith 方法,还有可能更干净的老好replaceChild。 (将您的新元素包装在一个非文档 div 中,将其 innerHTML 设置为想要的,然后将旧的 &lt;null&gt; 替换为非文档 div 的内容。

标签: javascript dom outerhtml


【解决方案1】:

考虑下面的 sn-p:

var element = document.createElement(null);
console.log(element);
document.body.appendChild(element);
console.log(element);
element.outerHTML = "<div id='hi'> hello there </div>";
console.log(element);
element = document.getElementById("hi");
console.log(element);

您会注意到,在使用outerHTML 之后,该引用是对原始元素的引用。如documentation中所述:

此外,虽然文档中的元素将被替换,但设置了 outerHTML 属性的变量仍将保留对原始元素的引用。

因此,最简单的方法是在设置说id 后实际使用document.getElementById() 来获取创建的新元素,或者像这样使用document.createElement() 来创建一个不太通用的对象并操纵它的innerHTML()

var element = document.createElement('div');
console.log(element);
element.innerHTML = ' hello there ';
document.body.appendChild(element);
console.log(element);

如你所见,在上面的sn-p中,element在改变其内容后是一样的。

更新:

使用一些创造性的技巧,您可以使用innerHTML 将您想要的内容添加到您创建的通用元素中,然后获取它的firstChild 并替换element,最后将其添加到您的文档中并保持选中状态。下面的示例向您展示了如何执行此操作:

var element = document.createElement(null);
element.innerHTML = '<div> hello there </div>';
element = element.firstChild;
document.body.appendChild(element);
console.log(element);

【讨论】:

  • @Quentin 你是对的,我最初没有提供更好的解决方案,所以我用一个更新了我的答案。抱歉耽搁了!
  • 谢谢。当然,使用 innerHTML 更容易,并且在某种程度上更优雅。但是,我有几种情况,在我注入的 html 周围包装任何东西都会导致布局问题。更具体地说,我所有的 HTML sn-ps 已经包含一个
    ....
    ,使用 innerHTML 可以让我进入
    。 ...
  • @resle 我认为您刚刚解释的内容是解决问题所需的大局的一部分。你能用简单的方式描述你想要完成的事情吗?您是在尝试更改现有元素的内容还是尝试添加新元素?
  • 我有一个元素库,如果您愿意,可以将它们称为“模板”,存储在字符串中。我需要编写一个函数,它采用这样的模板之一(例如
    ...
    ),基于这个字符串创建一个新元素,将它附加到 DOM 并返回元素进一步操作
  • 狡猾,谢谢。不过应该是 element = element.firstElementChild;
猜你喜欢
  • 1970-01-01
  • 2018-10-21
  • 2012-09-17
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多