Javascript 如何检查从DOM检索到的元素是否仍存在于DOM中
假设我得到了一个DOM元素,作为事件的参数,例如clickJavascript 如何检查从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 !!
$(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