在jQuery中比较DOM对象

时间:2011-09-19 17:50:39

标签: javascript jquery dom

我查看了其他SO帖子似乎是同一个问题,但事实并非如此。

我有以下内容:

<table>
  <tr id="first_row">
    <td><span id="first_span">item1</span></td>
    <td><span>item2</span></td>
  </tr>
  <tr id="second_row">
    <td><span>item1</span></td>
    <td><span>item2</span></td>
  </tr>
</table>

jQuery(function() {
  var $a = $("#first_row");
  var $b = $("#first_span").parents("tr");
  var $c = $("#second_row");
});

$a$b是两个不同的jQuery对象,但引用相同的DOM对象,$c是一个不同的DOM对象,但内容与$a相同, $b。如何比较它们,以便 $a等于$b但不等于$c ?感谢。

注意:我对jQuery和DOM相当新,所以希望我没有犯任何概念上的错误。如果有的话,请随时告诉我。

4 个答案:

答案 0 :(得分:12)

将DOM对象本身(位于jQuery对象内的数组中)与以下内容进行比较:

if ($a[0] === $b[0]) {
   // code for when first DOM object of each jQuery object is the same
}

or

if ($a[0] === $c[0]) {
   // code for when first DOM object of each jQuery object is the same
}

jQuery对象本身始终是独立的对象,因此您必须查看每个jQuery对象中实际DOM数组的内容。

您可以使用上面显示的数组语法或使用.get(x)方法访问jQuery对象中的DOM对象。 .get()方法有两个额外的功能,数组语法没有。如果不向.get()传递任何参数,则返回整个数组。如果传递一个负数,如.get(-1),它将返回一个从DOM元素数组末尾开始计数的DOM对象,而不是从头开始计数。

编辑1

如果你想比较两个jQuery对象中的整个数组(并且可以假设数组中DOM对象的顺序是相同的),你可以通过编写代码进行比较来实现:

function jQuerySame(a, b)
    if (a.length != b.length) {
        return(false);
    }
    for (var i = 0; i < a.length; i++) {
        if (a.get(i) != b.get(i) {
            return(false);
        }
    }
    return(true);
}

Then, you could use:

if (jQuerySame($a, $b)) {
    // code for when all DOM elements are the same in these two jQuery objects
}

这也可以通过jQuery插件机制成为jQuery方法。

编辑2

我刚刚发现了另一种使用.filter()方法执行此操作的方法,该方法与顺序无关且更简单。

function jQuerySame(a, b) {
    return(a.length === b.length && a.length === a.filter(b).length);
}

filter方法可以将jQuery对象作为输入。因此,如果我们按a对象过滤b对象并获得相同数量的结果,那么a中的每个对象都必须位于b中。如果b未包含a中的每个对象,则过滤后的对象的长度会更小。在jQuery源代码中,如果你将一个jQuery对象传递给filter()方法,它只是循环遍历一个数组,在另一个数组中调用$ .inArray(),从而消除第一个不在第二个中的那个 - 从而为我们做好工作。

答案 1 :(得分:7)

另一种可能性是.is功能:http://jsfiddle.net/pimvdb/LQgCM/1/

$a.is($b); // true
$a.is($c); // false

答案 2 :(得分:4)

您可以比较实际的DOM元素:

if ($a[0] === $b[0])

答案 3 :(得分:3)

您只想比较实际的DOM节点,而不是jQuery包装器。如,

$a[0] === $b[0]; // true
$a[0] === $c[0]; // false