¿Cómo compararías los objetos jQuery?

101

Así que estoy tratando de averiguar cómo comparar dos objetos jQuery para ver si el elemento principal es el cuerpo de una página.

esto es lo que tengo:

if ( $(this).parent() === $('body') ) ...

Sé que esto está mal, pero si alguien entiende a lo que me refiero, ¿podría indicarme la forma correcta de hacerlo?

Kyle Hotchkiss
fuente
2
var $parent = $(this).parent(), $body = $('body'); var theSame = $parent.is($body); api.jquery.com/is/#is-jQuery-object
Victor
1
$ (esto) .parent (). es ($ ('cuerpo')); // o verifique cualquier otra cosa además de $ ('body') stackoverflow.com/a/6986013/112100
Omu

Respuestas:

158

Debe comparar los elementos DOM sin procesar, por ejemplo:

if ($(this).parent().get(0) === $('body').get(0))

o

if ($(this).parent()[0] === $('body')[0])
CMS
fuente
1
Eso solo garantizará la igualdad si el objeto jQuery coincide con un solo elemento DOM. Si hubiera varias coincidencias, necesitaría un bucle de algún tipo para comparar cada una.
Jimmy Cuadra
1
@Jimmy, sí, pero esto es suficiente para los requisitos de OP, solo quiere saber "... si el elemento principal es el cuerpo ..."
CMS
2
Puede acortarse a: if (this.parentNode === document.body);
ehynds
60

Por qué no:

if ($(this).parent().is("body")) {
  ...
}

?

cletus
fuente
1
Oif ($(this).parent().is($("body")))
dieend
18

No se requiere bucle, no es necesario probar el primer nodo único. No se requiere prácticamente nada más que asegurarse de que tengan la misma longitud y compartan nodos idénticos. Aquí hay un pequeño fragmento de código. Es posible que incluso desee convertir esto en un complemento de jquery para sus propios usos.

jQuery(function($) {
  // Two separate jQuery references
  var divs = $("div");
  var divs2 = $("div");

  // They are equal
  if (divs.length == divs2.length && divs.length == divs.filter(divs2).length) {         

  // They are not
  } else {}
});
tbranyen
fuente
¿No diría esto que los siguientes divs son iguales? <div>abc</div> <div>def</div>
Charlie Schliesser
No, el filtro no pasaría elementos DOM que no sean iguales.
tbranyen
2

Tropecé con estas respuestas y me pregunté cuál era mejor. Todo depende de sus necesidades, pero el más fácil de escribir, leer y ejecutar es el mejor, por supuesto. Aquí está el caso de prueba de rendimiento que hice para tomar una decisión.

http://jsperf.com/jquery-objects-comparison

Salketer
fuente
Raw DOM Elements 2 reporta el más rápido para mí: se ve igual para todos los demás navegadores reportados también.
Kyle Hotchkiss
Exactamente, es el mismo que el primero, pero usa el análisis de matriz nativo de JavaScript.
Salketer