2011-08-08 72 views
33

我想用jQuery打開/關閉網頁上的控件'框'。不幸的是,如果用戶碰巧點擊已經打開的盒子,關閉盒子以重新打開盒子看起來不太好。 (框是互斥的)。如何比較兩個jQuery對象的身份?

我正在使用的代碼不起作用,我不知道爲什麼。我仍然收到一個盒子只是爲了重新開放,這不是所需的功能。我爲調試目的創建了'val'變量;在調試器中,它顯示'val'與$(this)具有完全相同的值,這會阻止它進入if語句中的.slideToggle(),但不會。

function openBox(index) 
{ 
    val = $('#box' + index); 
    $('.profilePageContentBox').each(function(){ 
     if($(this).css('display') != 'none') 
     { 
     if($(this) != val) 
     { 
      $(this).slideToggle(200); 
     } 
     } 
    }); 
    val.slideToggle(200); 
} 
+0

你可能想也看看這個:http://stackoverflow.com/questions/2436966/how-would-you-compare-jquery-objects – GnrlBzik

回答

46

使用$()功能總是會創建一個新的對象,所以不管是什麼,你的平等檢查總會失敗。

例如:

var div = document.getElementById('myDiv'); 

$(div) === $(div); // false! 

相反,你可以嘗試只存儲實際的DOM元素,因爲這些都只是簡稱 jQuery的對象中。

val = $('#box'+index).get(0); 
... 
if (this !== val) { } 
+7

謝謝!一旦StackOverflow讓我接受這個答案。你不僅回答了這個問題,還解釋了造成我的一個概念上的缺陷 - 「給一個人一條魚,教一個人去釣魚」 – RonLugge

+2

這個傢伙教你如何用釣魚竿釣魚(跛腳) ,底部答案教你如何用裸手(BA)釣魚! –

0

試試這個:

function openBox(index) 
{ 
val=$('#box'+index); 
$('.profilePageContentBox').each(function(){ 
    if($(this).is(":visible")) 
    { 
     if(!$(this).is("#box"+index)) 
      $(this).slideToggle(200); 
    } 
}); 
val.slideToggle(200); 
} 
78

你也可以這樣做:

if(val.is(this)) 
+1

簡單而直接。很好的回答 – Brandon

+2

這裏最好的答案。榮譽! –

+0

這應該被標記爲正確的答案。 – mtpultz