未引用DOM对象

时间:2017-03-28 09:56:50

标签: javascript oop dom reference

我有一个包含父元素的简单类,并且我存储了它的子元素进度,但是当我添加到子元素时没有任何反应

class MyClass {
  constructor(element) {
    this.elem = element;
    this.child = this.elem('.child');
    this.fill();
  }
  fill() {
    this.elem.innerHTML += '<span class="child2"></span>';
  }
  update(val) {
    this.child.style.width = val + '%';
  }
}

当我调用更新功能时,没有任何反应。如果我打印子元素,我发现它的样式为val%,但我没有看到它&#34;更新&#34;在DOM中。

它就像复制对象而不存储引用一样。

顺便说一句: 这也适用this.elem.querySelector('.child').style.width = val + '%';

同时尝试children[0]也不会工作。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

一个简单的实用程序,可将标记转换为documentFragment以便推送。

var dummy = document.createElement('div');
function fromHTML(markup){
    dummy.innerHTML = markup;
    for(var frag = document.createDocumentFragment(), fc; fc = dummy.firstChild;)
        frag.appendChild(fc);
    return frag;
}

所以不要node.innerHTML += someMarkup;更好地node.appendChild( fromHTML(someMarkup) )

在你的情况下

fill() {
    this.elem.appendChild( fromHTML('<span class="child2"></span>') );
}

或在这种简单的情况下,完全避免使用标记:

fill() {
    var child = document.createElement('span');
    child.className = "child2"; //avoid enumerated classes/valriables/everything
    this.elem.appendChild( child );
}

答案 1 :(得分:1)

正如评论者所说,这很可能与在父节点或节点本身上使用.innerHTML有关。这背后的原因是当你使用.innerHTML时,JavaScript会修改DOM并在节点innerHTML中“重建”它。这将释放现有节点的所有现有句柄。这意味着当您更新innerHTML时,所有侦听器和引用都将丢失。

考虑增加而不是编辑innerHTML,这将解决您的问题。