我查看了其他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相当新,所以希望我没有犯任何概念上的错误。如果有的话,请随时告诉我。
答案 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对象,而不是从头开始计数。
如果你想比较两个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方法。
我刚刚发现了另一种使用.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