说我有以下要素
<a id="first" class="myLink" data-something="0">First</a>
<a id="second" class="myLink" data-something="0">Second</a>
<a id="third" class="myLink" data-something="0">Third</a>
然后我改变数据 - 像这样的第一个元素
$('#first').data('something', 1)
现在,如果我这样做
$('#first').on('click', function(){
var element = $(this)
$('.myLink').each(function(){
if ($(this) == element) {
alert('equals')
}
})
})
然后单击第一个元素,我没有警告。
$ .each()中的元素似乎是文档加载时的元素,它不知道数据的对齐。
对此有何澄清? 还有另一种方法可以检索当前的元素状态吗?
答案 0 :(得分:3)
jQuery函数($
)返回 new Object
(通常称为“jQuery对象”),它表示DOM元素的集合(以及作为操纵集合的一些属性和方法)。即使选择了相同的元素(相同或不同的选择器,偶数),意味着jQuery对象包含相同的DOM元素,它们仍然不会相等。 JS对象永远不会==
(或===
),除非他们实际上将引用到相同的对象。
例如,即使$("#element_id") === $("#element_id")
选择了相同的元素,false
也是var el = $("#element_id"), ref = el; alert(el === ref);
。
但是true
会提醒$('#first').on('click', function(){
var element = this;
$('.myLink').each(function(i, el){
if (this === element) {
alert(i + ' equals');
}
});
});
因为它们都引用同一个对象。
如果要比较这些元素,请比较对DOM元素的引用,如下所示:
.is()
DEMO: http://jsfiddle.net/HEmB7/
有关JavaScript中对象相等性的内容:Object comparison in JavaScript - 它是重复的,但它和重复的帖子包含很多信息。
此比较的另一种方法是使用jQuery .is()
方法。如果使用得当,它可能非常强大。它接受字符串选择器,函数,jQuery对象或DOM元素引用。在一个像你这样的简单例子中,它可以很容易地被使用(但我几乎发现它太多了,因为当你可以使用{{1}时需要创建jQuery对象并由===
完成额外的处理)这也是有效和可靠的......尽管.is()
稍微更具可读性。以下是它的使用方法:
$('#first').on('click', function(){
var element = $(this);
$('.myLink').each(function(i, el){
if (element.is(this)) {
alert(i + ' equals');
}
});
});
DEMO: http://jsfiddle.net/HEmB7/2/
参考: