如何检查从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
,我想这可能会正常工作: – /