155 votes

égalité d'objet jQuery

Comment déterminer si deux objets jQuery sont égaux? J'aimerais pouvoir rechercher dans un tableau un objet jQuery particulier.

 $.inArray(jqobj, my_array);//-1    
alert($("#deviceTypeRoot") == $("#deviceTypeRoot"));//False
alert($("#deviceTypeRoot") === $("#deviceTypeRoot"));//False
 

235voto

nickf Points 185423

Depuis jQuery 1.6, vous pouvez utiliser .is. Ci-dessous est la réponse depuis plus d'un an...

var a = $('#foo');
var b = a;


if (a.is(b)) {
    // the same object!
}

Si vous voulez voir si deux variables sont en fait le même objet, par exemple:

var a = $('#foo');
var b = a;

...ensuite, vous pouvez vérifier leur Id unique. Chaque fois que vous créez un nouvel objet jQuery, il obtient un identifiant.

if ($.data(a) == $.data(b)) {
    // the same object!
}

Cependant, la même chose peut être réalisé avec un simple a === b, le ci-dessus pourrait au moins montrer la prochaine développeur exactement ce que vous allez tester.

En tout cas, ce n'est probablement pas ce que vous êtes après. Si vous voulais vérifier si les deux jQuery objets contiennent les mêmes éléments, vous pouvez utiliser ceci:

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

Source

var a = $('p');
var b = $('p');
if (a.equals(b)) {
    // same set
}

16voto

mauris Points 19666

Si vous ne savez toujours pas, vous pouvez récupérer l'objet d'origine en:

 alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True
alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True
 

car $("#deviceTypeRoot") renvoie également un tableau d'objets que le sélecteur a sélectionnés.

14voto

La solution "$ .fn.equals (...)" est probablement la plus propre et la plus élégante.

J'ai essayé quelque chose de rapide et sale comme ça:

 JSON.stringify(a) == JSON.stringify(b)
 

C'est probablement cher, mais le plus confortable est qu'il est implicitement récursif, contrairement à la solution élégante.

Juste mes 2 cents.

8voto

Elf King Points 948

Il est généralement une mauvaise idée de les comparer à $(foo) $(foo) qui est fonctionnellement équivalente à la comparaison suivante:

<html>
<head>
<script language='javascript'>
    function foo(bar) {
        return ({ "object": bar });
    }

    $ = foo;

    if ( $("a") == $("a") ) {
        alert ("JS engine screw-up");
    }
    else {
        alert ("Expected result");
    }

</script>

</head>
</html>

Bien sûr, vous ne serait jamais s'attendre à "JS moteur vis-up". J'utilise "$" juste pour rendre clair ce que jQuery est en train de faire.

Chaque fois que vous appelez $("#foo"), vous êtes en train de faire un jQuery("#foo") qui renvoie un nouvel objet. Donc, en les comparant et en attend de même de l'objet n'est pas correct.

Cependant ce que vous POUVEZ faire peut-être quelque chose comme:

<html>
<head>
<script language='javascript'>
    function foo(bar) {
        return ({ "object": bar });
    }

    $ = foo;

    if ( $("a").object == $("a").object ) {
        alert ("Yep! Now it works");
    }
    else {
        alert ("This should not happen");
    }

</script>

</head>
</html>

Alors, vraiment, vous devriez peut-être à comparer les ID des éléments de jQuery objets dans votre véritable programme donc, quelque chose comme

... 
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")

est plus approprié.

4voto

OweR ReLoaDeD Points 1062

Utilisez la méthode Underscore.js isEqual http://underscorejs.org/#isEqual

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X