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

Tre*_*ham 143 jquery

假设我定义了一个元素

$foo = $('#foo');
Run Code Online (Sandbox Code Playgroud)

然后我打电话

$foo.remove()
Run Code Online (Sandbox Code Playgroud)

从某些事件.我的问题是,如何检查$ foo是否已从DOM中删除?我发现它$foo.is(':hidden')有效,但如果我只是打电话,那当然也会成功$foo.hide().

SLa*_*aks 232

像这样:

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

如果删除了元素的父元素之一(在这种情况下元素本身仍将具有父元素),这仍然有效.

  • @PerroAzul:我发现了一个更快的选择:http://jsperf.com/jquery-element-in-dom/2 (48认同)
  • 做`$ foo.closest(document.documentElement)`更快(如果有人关心http://jsperf.com/jquery-element-in-dom) (14认同)
  • 有一种纯DOM方法可以做到这一点,它在语法上更具可读性,而且我认为在性能方面非常相似:`document.contains($ foo [0])` (10认同)
  • 性能是我对这种方法的直接关注,感谢链接基准@SLaks.所以它看起来像`$ .contains(document.documentElement,$ foo.get(0))`是最快的方法. (3认同)
  • 所有这些关于性能的讨论......?基准测试显示一种方法需要15微秒,另一种方法需要0.15微秒.但是真的,谁在乎 - 除非你做了十万​​次,否则你不会注意到任何差别.如果jQuery或JavaScript引擎得到优化,它可能会发生变化.只需使用任何方法,以及将来必须维护代码的人. (3认同)
  • 略快:$ .contains(document,$ foo [0]) - 测试DOM和out中的两个元素:http://jsperf.com/jquery-element-in-dom/8 (2认同)
  • @James-或除非您的网站是`facebook.com`并且您的DOM像地球的核心一样深。 (2认同)

Kus*_*our 21

这样做怎么样:

$element.parents('html').length > 0
Run Code Online (Sandbox Code Playgroud)

  • 实际上它是最慢的一个:http://jsperf.com/jquery-element-in-dom/60 (14认同)

lxg*_*lxg 7

也许最具表现力的方式是:

document.contains(node); // boolean
Run Code Online (Sandbox Code Playgroud)

这也适用于 jQuery:

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

来源MDN

笔记:


Tre*_*ham 5

当我输入我的问题时,我才意识到答案:打电话

$foo.parent()
Run Code Online (Sandbox Code Playgroud)

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

[编辑:这不完全正确,因为删除的元素仍然可以拥有父元素; 例如,如果你删除a <ul>,它的每个子<li>节点仍然会有父节点.请改用SLaks的答案.

  • ...除非被移除的节点不是唯一的孩子 (2认同)
  • $foo.closest("body") 将是此技术的修复 (2认同)

Jaa*_*maa 5

由于我无法作为评论做出回应(我猜是业力太低了),这是一个完整的回复。最快的方法是轻松展开 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);
Run Code Online (Sandbox Code Playgroud)

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