我如何检查一个jQuery元素是否在DOM中?

假设我定义了一个元素

$foo = $('#foo'); 

然后我打电话

 $foo.remove() 

从某个事件。 我的问题是,如何检查$ foo是否已从DOM中删除? 我发现$foo.is(':hidden')可以工作,但是如果我仅仅调用$foo.hide() ,那当然也会返回true。

喜欢这个:

 if (!jQuery.contains(document, $foo[0])) { //Element is detached } 

如果元素的父母之一被删除(在这种情况下,元素本身仍然有父母),这仍然可以工作。

如何做到这一点:

 $element.parents('html').length > 0 

我刚刚意识到一个答案,因为我正在input我的问题:打电话

 $foo.parent() 

如果$f00已经从DOM中删除,那么$foo.parent().length === 0 。 否则,其长度至less为1。

[编辑:这是不完全正确的,因为一个被删除的元素仍然可以有一个父母; 例如,如果你删除了一个<ul> ,它的每个子<li>将仍然有一个父节点。 使用SLaks的答案来代替。

由于我无法回应评论(我猜测业绩太低),这里是一个完整的答复。 最快捷的方式是轻松展开jQuery检查以支持浏览器,并将常量因素降至最低。

正如在这里看到的 – http://jsperf.com/jquery-element-in-dom/28 – 代码将如下所示:

 var isElementInDOM = (function($) { var docElt = document.documentElement, find, contains = docElt.contains ? function(elt) { return docElt.contains(elt); } : docElt.compareDocumentPosition ? function(elt) { return docElt.compareDocumentPosition(elt) & 16; } : ((find = function(elt) { return elt && (elt == docElt || find(elt.parentNode)); }), function(elt) { return find(elt); }); return function(elt) { return !!(elt && ((elt = elt.parent) == docElt || contains(elt))); }; })(jQuery); 

这在语义上等价于jQuery.contains(document.documentElement,elt [0])。

同意佩罗的评论。 它也可以这样做:

 $foo.parents().last().is(document.documentElement); 
 if($foo.nodeType ){ element is node type} 
 jQuery.fn.isInDOM = function () { if (this.length == 1) { var element = this.get(0); var rect = element.getBoundingClientRect(); if (rect.top + rect.bottom + rect.width + rect.height + rect.left + rect.right == 0) return false; return true; } return false; }; 

我喜欢这个方法。 没有jQuery和没有DOMsearch。 首先find最高的父母(祖先)。 然后看看是否是documentElement。

 function ancestor(HTMLobj){ while(HTMLobj.parentElement){HTMLobj=HTMLobj.parentElement} return HTMLobj; } function inTheDOM(obj){ return ancestor(obj)===document.documentElement; } 

可能最具performance力的方式是:

 document.contains(node); // boolean 

这也适用于jQuery:

 document.contains($element[0]); // var $element = $("#some-element") document.contains(this[0]); // in contexts like $.each(), `this` is the jQ object 

来自MDN

注意:

  • Internet Explorer仅支持用于元素的contains()

为什么不只是: if( $('#foo').length === 0)...