Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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 如何检查从DOM检索到的元素是否仍存在于DOM中_Javascript_Jquery - Fatal编程技术网

Javascript 如何检查从DOM检索到的元素是否仍存在于DOM中

Javascript 如何检查从DOM检索到的元素是否仍存在于DOM中,javascript,jquery,Javascript,Jquery,假设我得到了一个DOM元素,作为事件的参数,例如click $(document).click(function() { myElement = $(this); }); 以后如何检查myElement是否仍在DOM中? 我不能使用.length或其他类似的东西,因为此时它仍然引用保存的元素和DOM的状态,对吗?您可以检查元素父元素: function isInDom(obj) { var root = obj.parents('html')[0] return !!

假设我得到了一个DOM元素,作为事件的参数,例如click

$(document).click(function() {
    myElement = $(this);
});
以后如何检查myElement是否仍在DOM中?
我不能使用.length或其他类似的东西,因为此时它仍然引用保存的元素和DOM的状态,对吗?

您可以检查元素父元素:

function isInDom(obj) {
    var root = obj.parents('html')[0] 
    return !!(root && root === document.documentElement);
}


if(isInDom(myElement)) {
     ...
}

下面是工作提示:

为了测试DOM中是否仍然存在元素,您需要再次对DOM进行爬网:

// store it in some shared scope
var myElement;
$(document).click(function() {
    myElement = $(this);
});

// sometime later...
if ($('#' + myElement.attr('id')).length > 0) {
    // it still exists
} else {
    // it no longer exists
}
但是,您单击的元素必须全部具有
id
s才能工作。可以使用类或任何其他选择器


编辑:有关如何为任何给定DOM元素获取唯一选择器的想法,请参阅。

这是假设您将设置可能的“可单击”元素的id

var idRef;
$(document).on('click', function() {
    idRef = this.id;    
});
以后

var exists = document.getElementById(idRef).length > 0;

您可以使用jQuery对象的undocumented
.selector
属性来查看元素是否仍在DOM中,条件是它使用唯一ID。​明显的


有关如何获取jQuery对象的选择器的更多信息,该对象可能唯一地描述它包含的DOM元素,也可能不唯一地描述它包含的DOM元素。

到目前为止,我看到的唯一可靠的方法是检查元素是否在
文档中。getElementsByTagName('*')


演示:

只是为了增加一些内容:

这确实是Inferpse的答案,对于Molle博士创建另一个body元素的一个极端情况,它可能包含从通用DOM树中删除的元素(当然,可能元素一开始就不在DOM中)。与Inferspe的答案一样,它采用jQuery包装的对象,而不是元素本身

function isInDom(jqobj) {
    var someBody = jqobj.parents('body');
    return someBody.length > 0 && someBody.get(0) === document.body;
}
​
我必须承认,我很难弄清楚我该如何打破这种局面

编辑:哦,是的。。。jsFiddle:


编辑II:当然,如果我们不是在讨论链接或脚本元素(任何可能进入
,而不是
,我想这可能会很好:-/

也许实现Inferpse功能的更好方法是扩展jQuery:

jQuery.fn.extend({
    isInDom: function() {
        var root = this.eq(0).parents('html')[0];
        return !!(root && root === document.documentElement);
    }
})
用法:

$("div").isInDom() //returns true if your dom contains a div
$("<div />").isInDom() //returns false
$().isInDom() //returns false
$(“div”).isInDom()//如果dom包含div,则返回true
$(“”)。isInDom()//返回false
$().isInDom()//返回false

您可能正在寻找。

这测试元素在存储时是否有父元素,它与元素是否仍在DOM中无关。
myElement
需要是一个包装元素的jQuery对象。。但是,是的,我也不认为这与存储时有任何关系。啊……但是当DOM对象是用jQuery包装的吗…?@Inferpse你说得对,我在一个+1中测试了它,一个元素可能有一个父体元素,而不是文档的一部分:呃…真的吗?那是很多标记。也许你可以将Inferpse的答案与你的答案结合起来,以1.测试元素是否从体标记中脱落。2.测试看看是否有元素的body标记是文档的body标记。(或者文档可以有多个body标记吗??)请参阅我的答案以澄清我的意思。我明白你的意思。但我无法想象没有本机的简单方法。
Node.contains()
对我来说很好。很好!但是Firefox 9+支持此方法吗?
function isInDom(jqobj) {
    var someBody = jqobj.parents('body');
    return someBody.length > 0 && someBody.get(0) === document.body;
}
​
jQuery.fn.extend({
    isInDom: function() {
        var root = this.eq(0).parents('html')[0];
        return !!(root && root === document.documentElement);
    }
})
$("div").isInDom() //returns true if your dom contains a div
$("<div />").isInDom() //returns false
$().isInDom() //returns false