2012-02-22 8 views
14

si intento algo como esto:¿Cómo verifico si 2 selectores jQuery apuntan al mismo elemento (s)?

$(".foo") === $(".foo") // = false 

... me sale falsa. Si, en cambio, intento esta consulta,

$(".foo").get(0) === $(".foo").get(0) // = true 

... Me hago cierto.

Esto se debe a:

{a:myObject} !== {a:myObject}; 
[myObject] !== [myObject]; 
myObject  === myObject; 

Me pregunto si hay alguna manera sucinta para la prueba de esta igualdad, preferentemente integrado en jQuery. El segundo método que escribí solo funciona correctamente si hay como máximo un elemento que coincide con .foo. La solución debería funcionar para cualquier cantidad de elementos.

Obviamente no quiero simplemente comprobar ".foo" === ".foo" ya que las selecciones que estoy usando son más complicadas. Simplemente los simplifiqué para este ejemplo. (Por ejemplo, es posible que quiera comprobar que $(this) es la selección de la misma cosa que $(".foo").)

+0

Debe retirar la respuesta de benekastah, aquí es una demostración de que refleja su respuesta: http://jsfiddle.net/kAv4X/ – MacMac

+0

@lolwut: que no funciona ya que es '() 'solo comprueba que * al menos uno de los elementos coincide con el otro selector (es decir, es un subconjunto). Eche un vistazo a: http://jsfiddle.net/dYAH3/ (debería decir falso en la primera alerta, pero dice verdadero). – Senseful

+0

Esta [respuesta] (http://stackoverflow.com/a/3856290/989121) parece ser la más precisa. – georg

Respuesta

7

No hay nada en la biblioteca central para comprobar la igualdad secuencia de objetos jQuery, sin embargo, el siguiente debe hacer el truco:

$.fn.sequenceEqual = function(compareTo) { 
    if (!compareTo || !compareTo.length || this.length !== compareTo.length) { 
    return false; 
    } 
    for (var i = 0, length = this.length; i < length; i++) { 
    if (this[i] !== compareTo[i]) { 
     return false; 
    } 
    } 
    return true; 
} 

lo que sería utilizable como tal:

$(".foo").sequenceEqual($(".bar")) 

Para completar, un método igual contenido podría escribirse así:

$.fn.contentsEqual = function(compareTo) { 
    return compareTo && this.length === compareTo.length && this.length === this.filter(compareTo).length; 
} 

Cuál sería utilizable como tal:

$(".foo").contentsEqual($(".bar")) 
-1

Ok, usando solamente órdenes internas jQuery, este parece ser el más adecuado

$(oneSelector).filter($(anotherSelector)).length == 1 

if ($ (oneSelector) .is ($ (anotherSelector))) ... son iguales

+6

No. De [los documentos] (http://api.jquery.com/is/): * "Verifique el conjunto de elementos coincidentes actual contra un selector, elemento o objeto jQuery y devuelva verdadero si ** al menos uno ** de estos elementos coincide con los argumentos dados. "* (mi énfasis). –

+1

Su respuesta actualizada con 'filter' aún no es correcta, aunque es un gran paso adelante. Debería verificar 'length' contra la longitud del conjunto original de elementos coincidentes, no' 1'. –

+0

@ T.J.Crowder: siempre que comparen un solo elemento (ver la pregunta), está bien. De todos modos, filter() es la forma correcta, así es como jQuery implementa is() internamente. – georg

4

Si desea comprobar si ambos conjuntos contienen exactamente el mismo eleme NTS (posiblemente en un orden diferente), entonces Array#every en combinación con $.fn.index podrían hacer el trabajo:

var $this = $("p"), 
    $other = $("p"); 


// same length and $other contains each element of $this 

var equal = $this.length === $other.length 
       && Array.prototype.every.call($this, function(elem) { 
        return $other.index(elem) > -1; 
       }); 
8

Creo que busca $().is. Docs here.

var foo, bar; 

foo = $('foo'); 
bar = $('.bar'); 

// This will check to see foo and bar contain the same elements 
foo.is(bar); // true | false 

Editar: @lolwut proporcionó una jsfiddle para esta respuesta. Después de leer los comentarios, los actualicé y determiné que esta respuesta no es confiable para el caso del OP.

+1

Esta debería ser la respuesta correcta. – MacMac

+3

@lolwut, no, 'is()' devolverá 'true' si * al menos uno de los elementos coincide con los argumentos dados *. –

+0

Eche un vistazo a [T.J. El comentario de Crowder] (http://stackoverflow.com/questions/9400500/how-do-i-check-if-2-jquery-selectors-are-pointing-to-the-same-elements/9401119#comment11878467_9400543) para un explicación de por qué esto no funciona. – Senseful

3

Como alternativa a la respuesta de pimvdb (que es muy buena, solo estoy proporcionando esto para que esté completa), puede aprovechar el hecho de que add() no agregará elementos que ya están presentes en el objeto jQuery.Por lo tanto, se puede escribir:

$.fn.containsSameElements = function(other) { 
    var len = this.length; 
    return other.length == len && this.add(other).length == len; 
}; 
Cuestiones relacionadas