首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DOM等价于jQuery `.detach()`?

DOM等价于jQuery `.detach()`?
EN

Stack Overflow用户
提问于 2018-02-05 15:42:46
回答 2查看 4.7K关注 0票数 11

我试图删除一个输入字段,点击一个“X按钮”。删除后,它将不会在提交表单时发布其值。出现一个“+”按钮,允许用户再次添加所述输入。输入有一个打开日历的onclick事件,在重新附加之后,日历不再按单击打开。我不能用jQuery。

代码语言:javascript
复制
adderBtn.onclick = function (e) {
    var elem = that.hiddenElems.shift();
    that.collectionItemContainer.append(elem);
}

removerBtn.onclick = function (e) {
    collectionItemElem.remove();
    that.hiddenElems.push(collectionItemElem);
}

问题是如何在不丢失事件的情况下删除和重新附加DOM节点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-05 15:46:57

删除元素时,只要保留对其的引用,就可以将其放回。所以:

代码语言:javascript
复制
var input = /*...code to get the input element*/;
input.parentNode.removeChild(input); // Or on modern browsers: `input.remove();`

如果你想把它放回去

代码语言:javascript
复制
someParentElement.appendChild(input);

与jQuery不同,DOM没有区分“删除”和“分离”-- DOM操作始终等同于“分离”,这意味着如果您将元素添加回,它仍然有它的处理程序:

活生生的例子:

代码语言:javascript
复制
var input = document.querySelector("input[type=text]");
input.addEventListener("input", function() {
  console.log("input event: " + this.value);
});
input.focus();
var parent = input.parentNode;
document.querySelector("input[type=button]").addEventListener("click", function() {
  if (input.parentNode) {
    // Remove it
    parent.removeChild(input);
  } else {
    // Put it back
    parent.appendChild(input);
  }
});
代码语言:javascript
复制
<form>
  <div>
    Type in the input to see events from it
  </div>
  <label>
    Input:
    <input type="text">
  </label>
  <div>
    <input type="button" value="Toggle Field">
  </div>
</form>

如果您删除元素而不保留对它的任何引用,那么它就有资格进行垃圾收集,就像附加到它的任何处理程序一样(如果没有其他引用,并忽略这方面的一些历史IE错误.)。

票数 20
EN

Stack Overflow用户

发布于 2018-02-05 15:49:17

以函数形式分离元素:

代码语言:javascript
复制
function detatch(elem) {
    return elem.parentElement.removeChild(elem);
}

这将返回“分离”元素。

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

https://stackoverflow.com/questions/48626203

复制
相关文章

相似问题

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