Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML元素附加到文档_Javascript_Html_Dom - Fatal编程技术网

Javascript HTML元素附加到文档

Javascript HTML元素附加到文档,javascript,html,dom,Javascript,Html,Dom,使用removeChild()从DOM中删除元素时,对该元素的引用仍然存在,但该元素不再位于DOM中。 如何知道HTML元素(或其父元素)是否仍附加到文档?如果它直接附加到文档,请检查其parentNode属性。如果没有这样的父元素,或者引用了父元素,则为null 下一个代码说明了它的用法,它打印null,[Object HTMLBodyElement]和null var elm = document.createElement("p"); alert(elm.parentNode); doc

使用
removeChild()
从DOM中删除元素时,对该元素的引用仍然存在,但该元素不再位于DOM中。

如何知道HTML元素(或其父元素)是否仍附加到文档?

如果它直接附加到文档,请检查其
parentNode
属性。如果没有这样的父元素,或者引用了父元素,则为
null

下一个代码说明了它的用法,它打印
null
[Object HTMLBodyElement]
null

var elm = document.createElement("p");
alert(elm.parentNode);

document.body.appendChild(elm);
alert(elm.parentNode);

elm.parentNode.removeChild(elm);
alert(elm.parentNode);
再次注意,这仅适用于使用
removeChild
删除的元素,如果删除了父元素,则必须检查该父元素的
parentNode
属性

要确定某个元素是否真的是文档的一部分,您必须检查最上面的父元素是否是
document

function element_is_part_of_document(element) {
    /* as long as the element is not document, and there is a parent element */
    while (element != document && element.parentNode) {
        /* jump to the parent element */
        element = element.parentNode;
    }
    /* at this stage, the parent is found. If null, the uppermost parent element */
    /* is not document, and therefore the element is not part of the document */
    return element == document;
}

继续检查元素的父节点,直到到达文档或节点用尽为止

function is_element_in_document ( element ) {
    if (element === document) {
        return true;
    }
    element = element.parentNode;
    if (element) {
        return is_element_in_document ( element );
    }
    return false;
}
发件人:


函数包含(父级、子级){
返回parent==substant | | Boolean(parent.compareDocumentPosition(substant)&16);
}
addEventListener(“DOMContentLoaded”,function()){
var p=document.getElementById(“测试”);
//文件.body.removeChild(p);
警报(包含(文档,p));
},假);

测试

不过我只考了歌剧

该页面上也有其他选择。

答案是:

if(document.body.contains(yourElement)) {
    // Yep, it's attached.
}
兼容性:IE5+

对于较新的浏览器(不支持IE),可以使用
节点。isConnected
,它是
节点上的一个属性,返回布尔值


这将告诉您一个元素是否附加到另一个元素,而不是文档。@David:是的,但在回答的上下文中,这看起来不是问题。我不断改进答案;)昆汀,问题是“节点或其父节点”,所以莱肯斯廷的答案是correct@0x89找到了备用地址并修复了链接。感谢您的报道。对于任何想知道16代表什么的人来说,它是一个常量变量
节点。请参见中所述的文档中。IE 8及更低版本也不支持此方法。
document.contains
不适用于ie11,但
document.body.contains
适用。请不要使用递归!递归不一定是邪恶的,但它极大地损害了性能!如果在树的深处有90个节点,那么内存中就需要90个
元素
变量(每个级别一个)来执行此递归。此外,如果深度超过几百个节点,则可能会出现堆栈溢出。此外,此stackoverflow完全依赖于浏览器,因此一些浏览器将正确加载页面,而另一些浏览器将出错。
if(document.body.contains(yourElement)) {
    // Yep, it's attached.
}
document.querySelectorAll('#myElement').isConnected;