我试图测试是否存在DOM元素,如果存在,则删除它,如果它不存在则创建它。
var duskdawnkey = localStorage["duskdawnkey"];
var iframe = document.createElement("iframe");
var whereto = document.getElementById("debug");
var frameid = document.getElementById("injected_frame");
iframe.setAttribute("id", "injected_frame");
iframe.setAttribute("src", 'http://google.com');
iframe.setAttribute("width", "100%");
iframe.setAttribute("height", "400");
if (frameid) // check and see if iframe is already on page
{ //yes? Remove iframe
iframe.removeChild(frameid.childNodes[0]);
} else // no? Inject iframe
{
whereto.appendChild(iframe);
// add the newly created element and it's content into the DOM
my_div = document.getElementById("debug");
document.body.insertBefore(iframe, my_div);
}
检查它是否存在有效,创建元素有效,但删除该元素不起作用。基本上所有这些代码都是通过单击按钮将iframe注入网页。我想要发生的是iframe已经在那里删除它。但由于某种原因,我失败了。
答案 0 :(得分:301)
removeChild
,即:
parent.removeChild(child);
在您的示例中,您应该执行以下操作:
if (frameid) {
frameid.parentNode.removeChild(frameid);
}
答案 1 :(得分:57)
在大多数浏览器中,从DOM中调用.removeChild(element)
比仅调用element.remove()
更简洁的方法是从DOM中删除元素。在适当的时候,这可能会成为从DOM中删除元素的标准和惯用方法。
2011年,.remove()
方法被添加到DOM Living Standard(commit),之后由Chrome,Firefox,Safari,Opera和Edge实施。任何版本的Internet Explorer都不支持它。
如果您想支持旧浏览器,则需要对其进行填充。事实证明这有点令人恼火,因为似乎没有人制作包含这些方法的通用DOM垫片,而且因为我们不只是将方法添加到单个原型中;它是ChildNode
的方法,它只是规范定义的接口,JavaScript无法访问,因此我们无法向其原型添加任何内容。因此,我们需要找到继承自ChildNode
并且实际上已在浏览器中定义的所有原型,并向其添加.remove
。
这是我提出的垫片,我已经确认在IE 8中有效。
(function () {
var typesToPatch = ['DocumentType', 'Element', 'CharacterData'],
remove = function () {
// The check here seems pointless, since we're not adding this
// method to the prototypes of any any elements that CAN be the
// root of the DOM. However, it's required by spec (see point 1 of
// https://dom.spec.whatwg.org/#dom-childnode-remove) and would
// theoretically make a difference if somebody .apply()ed this
// method to the DOM's root node, so let's roll with it.
if (this.parentNode != null) {
this.parentNode.removeChild(this);
}
};
for (var i=0; i<typesToPatch.length; i++) {
var type = typesToPatch[i];
if (window[type] && !window[type].prototype.remove) {
window[type].prototype.remove = remove;
}
}
})();
这不适用于IE 7或更低版本,因为extending DOM prototypes isn't possible before IE 8。不过,我认为,在2015年的边缘,大多数人不需要关心这些事情。
一旦你将shim包含在内,你就可以通过简单地调用
从DOM中删除DOM元素element
element.remove();
答案 2 :(得分:40)
似乎我没有足够的代表发表评论,因此需要另外一个答案。
当您使用removeChild()取消链接节点或通过在父节点上设置innerHTML属性时,您还需要确保没有其他任何内容引用它,否则它实际上不会被销毁并导致内存泄漏。在调用removeChild()之前,您可以通过多种方式获取对节点的引用,并且必须确保明确删除那些未超出范围的引用。
Doug Crockford写道here已知事件处理程序是IE中循环引用的原因,并建议在调用removeChild()之前如下显式删除它们
function purge(d) {
var a = d.attributes, i, l, n;
if (a) {
for (i = a.length - 1; i >= 0; i -= 1) {
n = a[i].name;
if (typeof d[n] === 'function') {
d[n] = null;
}
}
}
a = d.childNodes;
if (a) {
l = a.length;
for (i = 0; i < l; i += 1) {
purge(d.childNodes[i]);
}
}
}
即使你采取了很多预防措施,你仍然可以按照Jens-Ingo Farley here的描述在IE中获取内存泄漏。
最后,不要陷入认为Javascript 删除就是答案的陷阱。它似乎被许多人建议,但不会做这项工作。 Here是了解Kangax 删除的绝佳参考。
答案 3 :(得分:7)
使用 Node.removeChild()为您完成工作,只需使用以下内容:
var leftSection = document.getElementById('left-section');
leftSection.parentNode.removeChild(leftSection);
在DOM 4中,应用了删除方法,但根据W3C,浏览器支持很差:
方法node.remove()在DOM 4规范中实现。 但由于浏览器支持不佳,您不应该使用它。
但如果你使用jQuery,你可以使用remove方法......
$('#left-section').remove(); //using remove method in jQuery
同样在新的框架中,您可以使用条件删除元素,例如Angular和React中的*ngIf
,渲染不同的视图,取决于条件......