我如何检查一个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)...
?