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