Como você compararia objetos jQuery?

101

Portanto, estou tentando descobrir como comparar dois objetos jQuery, para ver se o elemento pai é o corpo de uma página.

aqui está o que eu tenho:

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

Eu sei que isso é errado, mas se alguém entender o que estou querendo dizer, poderia me indicar a maneira correta de fazer isso?

Kyle Hotchkiss
fonte
2
var $parent = $(this).parent(), $body = $('body'); var theSame = $parent.is($body); api.jquery.com/is/#is-jQuery-object
Victor
1
$ (this) .parent (). is ($ ('body')); // ou verifique se há algo além de $ ('body') stackoverflow.com/a/6986013/112100
Omu

Respostas:

158

Você precisa comparar os elementos DOM brutos, por exemplo:

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

ou

if ($(this).parent()[0] === $('body')[0])
CMS
fonte
1
Isso só garantirá a igualdade se o objeto jQuery corresponder a um único elemento DOM. Se houver várias correspondências, você precisará de algum tipo de loop para comparar cada uma.
Jimmy Cuadra
1
@Jimmy, sim, mas isso é suficiente para os requisitos de OP, ele quer apenas saber "... se o elemento pai é o corpo ..."
CMS
2
Pode ser abreviado para: if (this.parentNode === document.body);
Ehynds
60

Por que não:

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

?

cletus
fonte
1
Ouif ($(this).parent().is($("body")))
fim de
18

O loop não é necessário, o teste do primeiro nó único não é necessário. Praticamente nada é necessário além de garantir que eles tenham o mesmo comprimento e compartilhem nós idênticos. Aqui está um pequeno trecho de código. Você pode até querer convertê-lo em um plugin jquery para seu próprio uso.

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
fonte
Isso não diria que os seguintes divs são iguais? <div>abc</div> <div>def</div>
Charlie Schliesser,
Não, o filtro não passaria elementos DOM que não sejam iguais.
tbranyen
2

Tropecei nessas respostas e me perguntei qual era a melhor. Tudo depende das suas necessidades, mas o mais fácil de digitar, ler e executar é o melhor, é claro. Aqui está o caso de teste de desempenho que fiz para tomar uma decisão.

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

Salketer
fonte
Raw DOM Elements 2 relatando o mais rápido para mim: parece o mesmo para todos os outros navegadores relatados.
Kyle Hotchkiss
Exatamente, é o mesmo que o primeiro, mas usa a análise de array nativa do javascript.
Salketer