2011-08-08 9 views
33

Estoy tratando de usar jQuery para abrir/cerrar cuadros de control en una página web. Desafortunadamente, no parece muy bueno cerrar una caja solo para volver a abrirla si el usuario hace clic en la casilla ya abierta. (Las cajas son mutuamente excluyentes).¿Cómo comparo dos objetos jQuery para identidad?

El código que estoy usando no funciona, y no estoy seguro de por qué. Todavía tengo una caja que se cierra solo para abrir de nuevo, que no es la funcionalidad deseada. Creé la variable 'val' para propósitos de depuración; en el depurador, se muestra que 'val' tiene exactamente el mismo valor que $ (esto), lo que debería evitar que llegue al .slideToggle() dentro de la instrucción if, pero no es así.

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

Es posible que desee mirar también a esto: http://stackoverflow.com/questions/2436966/how-would-you-compare-jquery-objects – GnrlBzik

Respuesta

46

Uso de la función $() siempre creará un nuevo objeto, así que no importa lo que, a su igualdad comprobar que siempre se producirá un error.

Por ejemplo:

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

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

En su lugar, usted podría intentar simplemente almacenar los elementos DOM reales, ya que esos son sólo se refiere a los objetos dentro de jQuery.

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

Gracias! Tan pronto como StackOverflow me permita, aceptaré esta respuesta. No solo respondiste la pregunta, sino que también me explicaste la falla conceptual que me estaba aturdiendo: "dale a un hombre un pescado, enséñale a pescar" – RonLugge

+2

este tipo te enseñó a pescar con una caña de pescar (cojo) , la respuesta inferior te enseña a pescar con tus propias manos (BA) –

0

Prueba esto:

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

También puede hacer:

if(val.is(this)) 
+1

Simple y directo. Gran respuesta – Brandon

+2

la mejor respuesta aquí. ¡prestigio! –

+0

Esto debe marcarse como la respuesta correcta. – mtpultz

Cuestiones relacionadas