检测页面上是否有jQuery对象

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

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

要么

 $j = $('

Where is pancake house?

').appendTo($('#this-is-already-there'));

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

 $j = $("

I'll cook you some eggs, Margie.

");

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

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

  1. 看看它是否有父: $j.parent().length > 0表示它在页面上。
  2. 看看它是否有一个有效的索引: $j.index() > -1表示它在页面上。

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

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

就个人而言,我首先从你知道在页面中的元素开始,比如 ,然后使用.has()

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

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

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

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

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

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

 $.expr[':'].isProbablyAttached = function(obj){ return $(obj).closest('body').size()>0; }; // Usage: $('.someClasses:isProbablyAttached').doSomething(); 

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

 $j = $("

I'll cook you some eggs, Margie.

"); $j.parent().length === 0 $('html').parent().length === 1 $('body').parent().length === 1

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

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

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

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

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