检测页面上是否有jQuery对象

时间:2011-03-25 03:37:19

标签: jquery dom

给定一个jQuery对象$j,我需要知道它是否代表页面上已有的东西,或者它是否还没有放在页面上。例如,如果我有这个:

$j = $('#id-of-something-already-on-the-page');

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

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

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

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

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

  1. 查看它是否有父级:$j.parent().length > 0表示它在页面上。
  2. 查看它是否具有有效索引:$j.index() > -1表示它在页面上。
  3. 如果$jhtml或可能body,我可以看到第一个失败;我很高兴忽略这两个病理案例。我想不出第二种方法会失败的方式。

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

4 个答案:

答案 0 :(得分:31)

就个人而言,我首先要从页面中知道 的元素开始,例如<html><body>,然后使用.has():< / p>

if ($('html').has($j).length)
{
    // $j is in the page
}

这甚至适用于您提到的两种病理情况。检查.length而不是.size()more idiomatic。也没有理由检查返回的值是> 0length属性总是是非负整数,因此检查值的真实性就足够了。

答案 1 :(得分:6)

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

$j.closest('body').size()>0

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

此“可能已附加到页面”的检查也可以转为bona-fide jQuery selector

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

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

// Usage:
$('.someClasses:isProbablyAttached').doSomething();

答案 2 :(得分:3)

使用jQuery(至少使用版本1.7.1)$('html').parent()返回非空数组([#document]):

$j = $("<p>I'll cook you some eggs, Margie.</p>");
$j.parent().length === 0
$('html').parent().length === 1
$('body').parent().length === 1

所以'亩太短'的说明不是问题:

  

如果$ j是html或者可能是正文,我可以看到第一个失败;我很高兴忽略这两个病理案例。我想不出第二种方法会失败的方式。

答案 3 :(得分:-1)

jQuery对象表示html元素的集合。

选择后:$ j = $('#id-of-something-already-on-the-page');

你所要做的就是检查$ j.length。如果是1,则页面上有一个项目。