Равномерность объекта jQuery

Как определить, равны ли два объекта jQuery? Я хотел бы иметь возможность искать массив для конкретного объекта jQuery.

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

Ответ 1

С jQuery 1.6 вы можете использовать .is. Ниже приведен ответ от года назад...

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


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

Если вы хотите увидеть, являются ли две переменные фактически одним и тем же объектом, например:

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

... тогда вы можете проверить их уникальные идентификаторы. Каждый раз, когда вы создаете новый объект jQuery, он получает идентификатор.

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

Хотя, то же самое можно было бы сделать с помощью простого a === b, приведенное выше могло бы, по крайней мере, показать следующему разработчику именно то, что вы тестируете.

В любом случае, возможно, это не то, что вам нужно. Если вы хотите проверить, содержит ли два разных объекта jQuery один и тот же набор элементов, вы можете использовать это:

$.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;
};

Источник

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

Ответ 2

Если вы все еще не знаете, вы можете вернуть исходный объект:

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

потому что $("#deviceTypeRoot") также возвращает массив объектов, выбранных селектором.

Ответ 3

Решение $.fn.equals(...), вероятно, является самым чистым и самым элегантным.

Я пробовал что-то быстрое и грязное:

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

Это, вероятно, дорого, но удобная вещь заключается в том, что она неявно рекурсивна, а элегантное решение - нет.

Только мои 2 цента.

Ответ 4

Это, вообще говоря, плохая идея сравнить $(foo) с $(foo), поскольку это функционально эквивалентно следующему сравнению:

<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>

Конечно, вы никогда не ожидали "JS-двигателя". Я использую "$", чтобы дать понять, что делает jQuery.

Всякий раз, когда вы вызываете $( "# foo" ), вы на самом деле выполняете jQuery ( "# ​​foo" ), который возвращает новый объект. Поэтому сравнение их и ожидающих того же объекта неверно.

Однако вы можете сделать что-то вроде:

<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>

Итак, действительно, вам стоит сравнить идентификационные элементы объектов jQuery в вашей реальной программе, чтобы что-то вроде

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

является более подходящим.