如何检查从DOM检索的元素仍然存在于DOM中

假设我有一个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)) { ... } 

这是工作小提琴: http : //jsfiddle.net/vnxhQ/7/

到目前为止我唯一可靠的方法是检查元素是否在document.getElementsByTagName('*')

 function isInDoc(element) { var elements=document.getElementsByTagName(element.tagName); for(var i=0;i 

演示: http//jsfiddle.net/doktormolle/hX8eN/


Node.contains()似乎得到了所有主流浏览器的支持,所以我最后建议:

 if(document.documentElement.contains(myElement)) 

演示: http//jsfiddle.net/doktormolle/LZUx3/

这假设您将拥有可能的“可点击”元素集的ID

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

后来..

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

也许更好的实现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 $("
").isInDom() //returns false $().isInDom() //returns false

为了测试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才能使其正常工作。 可以使用类或任何其他选择器。

编辑:请参阅此问题 ,了解如何为任何给定的DOM元素获取唯一选择器。

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

http://jsfiddle.net/mblase75/CC2Vn/

 $two = $('#two'); console.log($($two.selector).length); // 1 $two.remove(); console.log($($two.selector).length); // 0 

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

只是为了加入一些东西:

这真的是Inferpse的回答,稍微调整了Dr.Molle创建另一个可能容纳从一般DOM树中删除的元素的主体元素的角落情况(或者,当然,也许元素从来没有在DOM中。) Inferspe的回答是,它需要一个jQuery包装的对象,而不是元素本身。

 function isInDom(jqobj) { var someBody = jqobj.parents('body'); return someBody.length > 0 && someBody.get(0) === document.body; }​ 

我必须承认,我无法弄清楚如何打破这种局面。

编辑:哦是啊… jsFiddle: http : //jsfiddle.net/vnxhQ/5/

编辑II:当然,如果我们不是在谈论链接或脚本元素(任何可能进入head ,而不是body ,我想这可能会正常工作: – /