比方说,我定义元素如何检查jQuery元素是否在DOM中?
$foo = $('#foo');
,然后我打电话
$foo.remove()
一些事件。我的问题是,如何检查$ foo是否已从DOM中删除?我发现$foo.is(':hidden')
作品,但这当然也返回true,如果我只是叫$foo.hide()
。
比方说,我定义元素如何检查jQuery元素是否在DOM中?
$foo = $('#foo');
,然后我打电话
$foo.remove()
一些事件。我的问题是,如何检查$ foo是否已从DOM中删除?我发现$foo.is(':hidden')
作品,但这当然也返回true,如果我只是叫$foo.hide()
。
像这样:
if (!jQuery.contains(document, $foo[0])) {
//Element is detached
}
如果该元素的父母之一是删除(在这种情况下,元素本身仍然有一个父)这仍然可以工作。
我才意识到,我打字我的问题的答案:呼叫
$foo.parent()
如果$f00
已从DOM删除,那么$foo.parent().length === 0
。否则,它的长度将是至少为1。
[编辑:这是不完全正确的,因为去除元件仍然可以有一个父;举例来说,如果你删除一个<ul>
,它的每个子<li>
S的仍将有一个父。改用SLaks的答案。
...除非删除节点不是唯一的孩子 – 2010-06-21 15:41:51
@阿尔瓦罗 - 为什么会是怎么回事? – user113716 2010-06-21 16:04:23
@帕特里克:我错过了什么?如果$ foo.parent()。length长度大于零,你能保证什么? – 2010-06-21 16:22:57
如何这样做:
$element.parents('html').length > 0
我认为这是更快 – 2014-07-17 02:21:31
其实它是最慢的一个:http://jsperf.com/jquery-element-in-dom/60 – suda 2015-01-12 19:35:25
同意佩罗的评论。它也可以这样做:
$foo.parents().last().is(document.documentElement);
由于我无法作为评论作出回应(我猜测业绩太低),这里是一个完整的答复。最快的方法是轻松展开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])。
为什么不干脆:if($('#foo').length === 0)...
?
@stevematdavies问题是“如何测试给定的jQuery对象中的元素在DOM中“,而不是”如何测试与给定选择器字符串匹配的元素是否在DOM中“。 – 2015-06-18 21:27:38
@TrevorBurnham:平心而论,使用用于创建'$ foo'的选择器重新查询,并检查重新查询是否匹配任何元素,似乎是许多情况下可行的解决方案。由于jQuery和浏览器如何优化某些选择器(比如通过ID),它甚至可能比其他解决方案的*更快。 – Matt 2015-06-18 21:42:41
@Matt $ foo可能是从DOM中分离的内存中的一个元素,并且可能会有一个元素与DOM中的匹配选择器。寻找这个问题的答案的人可能想要检查它是否在DOM中。有人在这样的东西中工作,显然知道如何查询DOM。 – 2017-03-03 17:07:54
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和没有DOM搜索。首先找到最高的父母(祖先)。然后看看这是否是documentElement。
function ancestor(HTMLobj){
while(HTMLobj.parentElement){HTMLobj=HTMLobj.parentElement}
return HTMLobj;
}
function inTheDOM(obj){
return ancestor(obj)===document.documentElement;
}
可能是最表演方式是:
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
注:
有人看过这个答案吗?很好的回答+1(我收到了一个版本,谢谢) – 2017-10-22 23:24:07
+1这就是光滑:) – 2012-08-09 13:13:53
做'$ foo.closest(document.documentElement)'更快(如果有人在乎http://jsperf.com/jquery-element-in-dom) – urraka 2013-02-02 14:03:23
@PerroAzul:我发现了一个_much_更快的替代方法:http://jsperf.com/jquery-element-in-dom/2 – SLaks 2013-02-03 00:12:22