检测页面上是否有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
是否在页面上? 我知道两种方式的工作做得很好:
- 看看它是否有父:
$j.parent().length > 0
表示它在页面上。 - 看看它是否有一个有效的索引:
$j.index() > -1
表示它在页面上。
如果$j
是html
或者可能是body
,我可以看到第一个失败; 我很高兴忽略这两个病态的案例。 我想不出第二种方法会失败的方式。
是否有一种标准技术来询问页面上是否有jQuery对象? 我不在乎$j
是否可见。
就个人而言,我首先从你知道在页面中的元素开始,比如或
,然后使用
.has()
:
if ($('html').has($j).length) { // $j is in the page }
这甚至适用于您提到的两个病理情况。 检查.length
而不是.size()
更加惯用 。 也没有理由检查返回的值是否> 0
。 length
属性将始终为非负整数,因此检查值的真实性就足够了。
我可能只是检查元素是否可以到达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。 如果是一个,页面上有一个项目。