检测页面上是否有jQuery对象

mu *_*ort 22 jquery dom

给定一个jQuery对象,$j我需要知道它是否表示已经在页面上的内容,或者它是否是尚未放在页面上的内容.例如,如果我有这个:

$j = $('#id-of-something-already-on-the-page');
Run Code Online (Sandbox Code Playgroud)

要么

$j = $('<p>Where is pancake house?</p>').appendTo($('#this-is-already-there'));
Run Code Online (Sandbox Code Playgroud)

然后我在页面上有一些东西,我不需要把它放在页面上.但是,如果我有这个:

$j = $("<p>I'll cook you some eggs, Margie.</p>");
Run Code Online (Sandbox Code Playgroud)

然后我需要在它出现在页面之前附加它.

问题是你如何询问$j它是否在页面上?我知道两种方式工作得很好:

  1. 看看它是否有父:$j.parent().length > 0暗示它在页面上.
  2. 查看它是否具有有效索引:$j.index() > -1暗示它在页面上.

我可以看到第一个失败,如果$jhtml或可能的body; 我很高兴忽略这两个病理案例.我想不出第二种方法会失败的方式.

是否有一种标准技术来询问页面上是否有jQuery对象?我不在乎是否$j可见.

Mat*_*all 31

就个人而言,我首先从你知道在页面中的元素开始,<html>或者<body>,然后使用.has():

if ($('html').has($j).length)
{
    // $j is in the page
}
Run Code Online (Sandbox Code Playgroud)

这甚至适用于您提到的两个病理情况.这是更地道检查.length,而不是.size().也没有理由检查返回的值是什么> 0.该length属性将始终为非负整数,因此检查值的真实性就足够了.

  • "> 0"有一个很好的理由,那就是可读性.但是,它可能不值得额外的击键,特别是当大多数JavaScript程序员在没有它的情况下理解其含义时. (3认同)

Mic*_*ren 6

我可能只是检查元素是否可以到达body元素:

$j.closest('body').size()>0
Run Code Online (Sandbox Code Playgroud)

正如您在其他评论中指出的那样,在处理额外的body元素的一些特殊情况下,这会失败.如果你真的想要检测这些情况,我猜你可以查看你是否有多个$(body)元素,但我怀疑这种极端情况会很快失控.

这个"可能是附加到页面"的检查也可以转换为真正的jQuery选择器:

$.expr[':'].isProbablyAttached = function(obj){

    return $(obj).closest('body').size()>0;
};

// Usage:
$('.someClasses:isProbablyAttached').doSomething();
Run Code Online (Sandbox Code Playgroud)

  • 不用担心 - 他的解决方案更好(+1) (2认同)