2010-02-04 15 views
6

estoy usando un selector para conseguir un grupo de objetos (0 o más):comparar objetos jQuery

var $openMenus = $Triggers.filter(".trigger-hover"); 

Entonces tengo un evento adjunto a un elemento que puede o no estar en el objetivo anterior . Dentro de ese evento en el que quiero comparar el elemento que desencadena el evento a c

$([selector]) 
    .focus(function(){ 
     var $thisMenu = $(this); 
     $openMenus.each(function(){ 
      if ($(this) != $thisMenu){ 
       [do something] 
      } 
     }) 
    }) 

Esto no funcionará. Mientras que los objetos jQuery múltiples pueden REFERIRSE al mismo objeto DOM, en realidad son objetos jQuery separados y allí nunca se compararán como verdaderos.

Dado que, ¿cuál sería la forma de manejar esto? ¿Cómo se pueden tener dos objetos jQuery y compararlos para ver si un objeto jQuery se refiere al mismo elemento DOM que otro?

Podría dar a cada artículo que estoy tratando de seleccionar una identificación, pero me pregunto si hay otra manera de hacerlo sin tener que agregar más al HTML.

Respuesta

1

No sé por qué no quieres los valores "id", pero siempre puedes crear un pequeño complemento jQuery para dar a los elementos valores "id" únicos si les faltan valores del HTML original.

jQuery.fn.setId = (function setupSetId() { 
    var counter = 0; // or maybe new Date().getTime() 
    return function setId() { 
    return this.each(function setIdInternal() { 
     var $self = jQuery(this); 
     if (!$self.attr('id')) $self.attr('id', '_' + counter++); 
    }); 
    }; 
})(); 

Luego puede escribir otra utilidad para comparar matrices jQuery por elemento ID.

+0

ah ... cierto. No es una mala idea...de hecho, esa podría ser la opción más fácil. Aún así, me gustaría saber si se pueden comparar los objetos DOM referenciados en objetos jQuery. –

+0

Creo que puedes hacerlo con el operador de Javascript "===", pero no lo he intentado porque nunca he tenido el problema. – Pointy

+0

el operando === no pareció funcionar. Pero su ID inicial de seguir adelante y agregar ID funcionó bien. ¡Gracias! –

3

No puede hacer la comparación en el contenedor jQuery, pero puede hacerlo en el nodo DOM subyacente. Perder unos cuantos dólares y que estás bien:

.focus(function(){ 
    var that= this; 
    $openMenus.each(function(){ 
     if (this!==that){ 
      [do something] 
     } 
    }); 
}) 

(.. O utilizar por ejemplo wrapper[0] para obtener el nodo DOM desde un único tema de jQuery envoltorio)

(he usado === para la comparación porque es generalmente mejor, pero funcionaría con == también en este caso.)

10

Siguiendo de bobince, en lugar de usar wrapper [0], use el método get (0) apropiado para devolver el primer elemento almacenado en su objeto jQuery.

var focused = null; 
$(':input').focus(function() { 
    focused = $(this); 
    compare($(this)); 
    //Compare them...trivial but will return true despite being different jQuery objects. 
}).blur(function() {   
    focused = null; 
}); 

function compare(element) { 
    if (element.get(0) == focused.get(0)) { 
     alert('The same'); 
    } 
} 
+0

Esto es genial. Sin embargo, usaría === en lugar de == como su operador de comparación; estamos probando la igualdad absoluta aquí, no el tipo de coerción. – thismax

0

Puede solucionar esto utilizando la función .siblings() en jQuery. De esa forma puedes evitar comparar los objetos.


$(this).mouseenter(
    function(){ 
     //use functions you want to replace "someFunctionHere" 
     $(this).siblings().find('ul').someFunctionHere(); 
        //do something else... 
    } 
); 

mejor,
Guyun

1

Para comparar los elementos DOM debe comparar elementos de primas, que al tocar un botón como primer elemento en la matriz, como: ('test') $ [0].

Así, en su caso, el código debería tener este aspecto:

$([selector]) 
.focus(function(){ 
    var $thisMenu = $(this); 
    $openMenus.each(function(){ 
     if ($(this)[0] != $thisMenu[0]){ 
      [do something] 
     } 
    }) 
}) 
0

objetos jQuery no pueden compararse directamente, pero esto se puede conseguir fácilmente mediante el uso de .add() o .no() las operaciones:

var $thisMenu = $(this); 
$openMenus.each(function(){ 
    if ($(this).add($thisMenu).length == 1){ 
     [do something] 
    } 
}) 

o

var $thisMenu = $(this); 
$openMenus.each(function(){ 
    if ($(this).not($thisMenu).length == 0){ 
     [do something] 
    } 
}) 
Cuestiones relacionadas