2010-06-21 46 views
131

比方说,我定义元素如何检查jQuery元素是否在DOM中?

$foo = $('#foo'); 

,然后我打电话

$foo.remove() 

一些事件。我的问题是,如何检查$ foo是否已从DOM中删除?我发现$foo.is(':hidden')作品,但这当然也返回true,如果我只是叫$foo.hide()

回答

215

像这样:

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

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

+0

+1这就是光滑:) – 2012-08-09 13:13:53

+12

做'$ foo.closest(document.documentElement)'更快(如果有人在乎http://jsperf.com/jquery-element-in-dom) – urraka 2013-02-02 14:03:23

+47

@PerroAzul:我发现了一个_much_更快的替代方法:http://jsperf.com/jquery-element-in-dom/2 – SLaks 2013-02-03 00:12:22

4

我才意识到,我打字我的问题的答案:呼叫

$foo.parent() 

如果$f00已从DOM删除,那么$foo.parent().length === 0。否则,它的长度将是至少为1。

[编辑:这是不完全正确的,因为去除元件仍然可以有一个父;举例来说,如果你删除一个<ul>,它的每个子<li> S的仍将有一个父。改用SLaks的答案。

+1

...除非删除节点不是唯一的孩子 – 2010-06-21 15:41:51

+0

@阿尔瓦罗 - 为什么会是怎么回事? – user113716 2010-06-21 16:04:23

+0

@帕特里克:我错过了什么?如果$ foo.parent()。length长度大于零,你能保证什么? – 2010-06-21 16:22:57

21

如何这样做:

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

我认为这是更快 – 2014-07-17 02:21:31

+13

其实它是最慢的一个:http://jsperf.com/jquery-element-in-dom/60 – suda 2015-01-12 19:35:25

0

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

$foo.parents().last().is(document.documentElement); 
4

由于我无法作为评论作出回应(我猜测业绩太低),这里是一个完整的答复。最快的方法是轻松展开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])。

0

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

+0

@stevematdavies问题是“如何测试给定的jQuery对象中的元素在DOM中“,而不是”如何测试与给定选择器字符串匹配的元素是否在DOM中“。 – 2015-06-18 21:27:38

+0

@TrevorBurnham:平心而论,使用用于创建'$ foo'的选择器重新查询,并检查重新查询是否匹配任何元素,似乎是许多情况下可行的解决方案。由于jQuery和浏览器如何优化某些选择器(比如通过ID),它甚至可能比其他解决方案的*更快。 – Matt 2015-06-18 21:42:41

+0

@Matt $ foo可能是从DOM中分离的内存中的一个元素,并且可能会有一个元素与DOM中的匹配选择器。寻找这个问题的答案的人可能想要检查它是否在DOM中。有人在这样的东西中工作,显然知道如何查询DOM。 – 2017-03-03 17:07:54

0
if($foo.nodeType){ element is node type} 
0
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; 
}; 
0

我很喜欢这种方法。没有jQuery和没有DOM搜索。首先找到最高的父母(祖先)。然后看看这是否是documentElement。

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

可能是最表演方式是:

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

注:

+0

有人看过这个答案吗?很好的回答+1(我收到了一个版本,谢谢) – 2017-10-22 23:24:07

相关问题