首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改outerHTML后传递元素

更改outerHTML后传递元素
EN

Stack Overflow用户
提问于 2018-05-10 18:16:38
回答 1查看 216关注 0票数 0

我希望更改某些元素的outerHTML,然后将其传递给一个函数,这样该函数就可以对它做一些事情:

代码语言:javascript
复制
const bars = document.getElementsByClassName('bar');

for (let i = bars.length - 1; i >= 0; i -= 1) {
  const bar = bars[i];
  bar.outerHTML = `<h1 class="bar">${bar.innerHTML}</h1>`;
  const foo = new Foo(bar);
  // ... some code
  foo.doFoo();
}

function Foo (bar) {
  this.bar = bar;
  this.doFoo = function() {
    this.bar.innerHTML = `Foo${this.bar.innerHTML}`;
    console.log('doFoo:', this.bar.innerHTML);
    // expected on page: "Dog" --> "FooDog", "Turtle" --> "FooTurtle". This doesn't happen.
  }
}
代码语言:javascript
复制
<p class="bar">Dog</p>
<p>Cat</p>
<p class="bar">Turtle</p>

但是,尽管在outerHTML更改后DOM发生了变化,但变量bar仍然引用元素的“旧”(未更改)版本,这当然不再存在于DOM中。因此,不再可能更改DOM内容。

MDN上对此行为的解释:

在文档中替换元素时,设置了outerHTML属性的变量仍将保留对原始元素的引用。

如何实现Foo对象仍然知道DOM中的正确元素,而不必再次查询DOM?

EN

回答 1

Stack Overflow用户

发布于 2018-05-10 18:34:58

一种选择可能是获取对要更改其nextElementSibling的每个outerHTML元素的引用。我们叫它一个next吧。

然后,一旦更新了outerHTML,就可以使用以下方法更新对新元素的引用:

代码语言:javascript
复制
next.previousElementSibling

或者,实际上,如果您更新的元素已经是最后一个元素,并且nextElementSibling返回了undefined

代码语言:javascript
复制
next ? next.previousElementSibling : bar.parentElement.lastChild

代码语言:javascript
复制
const bars = document.getElementsByClassName('bar');

for (let i = bars.length - 1; i >= 0; i -= 1) {
  const bar = bars[i];
  const next = bar.nextElementSibling;
  
  bar.outerHTML = `<h1 class="bar">${bar.innerHTML}</h1>`;
  
  const foo = new Foo(next.previousElementSibling || next.parentElement.lastChild);
  
  // ...
  
  foo.doFoo();
}

function Foo (bar) {
  this.bar = bar;
  
  this.doFoo = function() {
    this.bar.innerHTML = `Foo${ this.bar.innerHTML }`;
    console.log('doFoo:', this.bar.innerHTML);
    // expected on page: "Dog" --> "FooDog", "Turtle" --> "FooTurtle". This doesn't happen.
  }
}
代码语言:javascript
复制
<p class="bar">Dog</p>
<p>Cat</p>
<p class="bar">Turtle</p>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50279138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档