单击的html元素不等于jQuery $ .each()循环中的相同元素

时间:2013-06-09 05:03:28

标签: javascript jquery

说我有以下要素

<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()中的元素似乎是文档加载时的元素,它不知道数据的对齐。

对此有何澄清? 还有另一种方法可以检索当前的元素状态吗?

1 个答案:

答案 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/

参考: