2011-03-25 75 views
22

給定一個jQuery對象$j,我需要知道它是否代表已經在頁面上的東西,或者它是否還沒有放在頁面上。舉例來說,如果我有這樣的:檢測一個jQuery對象是否在頁面上

$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意味着它在頁面上。

我可以看到第一個失敗如果$jhtml或者可能body;我很高興忽視這兩種病理情況。我想不出第二種方法會失敗。

有沒有一個標準的技術來詢問jQuery對象是否在頁面上?我不在乎$j是否可見。

+5

附加$ J能有一個家長,而不是放在你知道文檔... – jcolebrand 2011-03-25 03:39:13

+3

另一個可能的測試:'$ j.closest( '主體'),大小()> 0' – 2011-03-25 03:42:40

+0

@drachenstern:好點。提出問題的最好的部分是讓某人指出明顯的問題。據推測,同樣的問題也適用於索引方法,因爲他們正在檢查類似的東西。 – 2011-03-25 03:51:20

回答

31

就個人而言,我會從一個元素開始下降,你知道在頁面中,像<html><body>,並使用.has()

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

這個工程即使你提到的兩種病理情況。它是more idiomatic來檢查.length而不是.size()。也沒有理由檢查返回的值是否爲> 0length財產將總是是一個非負整數,所以它足以檢查值的真實性。

+3

'> 0'有一個很好的理由,那就是可讀性。但是,這可能不值得額外的按鍵操作,特別是當大多數JavaScript編碼器在沒有它的情況下會理解它的含義。 – Muhd 2011-11-21 23:02:25

+0

我對這個大頁面的重量有輕度擔憂。但+1,這是肯定的。 – ANeves 2013-09-24 08:05:57

-1

jQuery對象表示html元素的集合。在您選擇之後:$ j = $('#id-of-something-already-on-the-page');

您只需檢查$ j.length即可。如果是一個,頁面上有一個項目。

+0

不正確。如果我分離節點並將其存儲在變量中,它仍然作爲變量存在。如果我稍後測試該變量以查看某些代碼是否將其重新插入到DOM中(想想:每次傳遞引用而不是重新過濾,並且分支語句執行各種操作(如分離或打包)),那麼它可能會也可能不會在DOM中。如果你正在寫一個函數來傳遞一個節點的引用,你不可能總是知道這個id是什麼。另外:上下文查詢。 – jcolebrand 2011-03-25 04:11:07

+0

或者如果我有'$ j = $(「

我會煮一些雞蛋,Margie,

」)'然後'$ j.length == 1',但是段落不在頁面上,直到我'$ ('body')。append($ j)'(或類似的東西)將其插入到DOM中。 – 2011-03-25 04:37:12

6

我可能只是檢查,看看是否元素可以到達身體的元素:

$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(); 
+0

我之前使用過'$ .expr',但現在我只需要一個地方,所以我不認爲我需要那樣。然而。 – 2011-03-27 20:30:12

+1

@Michael @mu爲什麼不最近('html')'? – 2011-03-28 22:59:22

+0

爲什麼在只能使用'.length'時使用'.size()> 0'? http://docs.jquery.com/Frequently_Asked_Questions#How_do_I_test_whether_an_element_exists.3F – 2011-04-01 17:38:31

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或可能的body,我可以看到第一個失敗;我很高興忽視這兩種病理情況。我想不出第二種方法會失敗。