0

说我有以下元素

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

对此有何澄清?是否有另一种方法来检索元素的当前状态?

4

1 回答 1

3

jQuery 函数 ( $) 返回一个 Object的(通常称为“jQuery 对象”),它表示 DOM 元素的集合(以及一些用于操作该集合的属性和方法)。即使选择了相同的元素(甚至是相同或不同的选择器),这意味着 jQuery 对象包含相同的 DOM 元素,它们仍然不相等。JS 对象永远不会==(或===),除非它们实际上引用一个对象。

例如,$("#element_id") === $("#element_id")即使false他们选择了相同的元素。

但是var el = $("#element_id"), ref = el; alert(el === ref);会提醒true,因为它们都指的是同一个对象。

如果要比较这些元素,请比较对 DOM 元素的引用,如下所示:

$('#first').on('click', function(){
    var element = this;
    $('.myLink').each(function(i, el){
        if (this === element) {
            alert(i + ' equals');
        }
    });
});

演示:http: //jsfiddle.net/HEmB7/

关于 JavaScript 中的对象相等性的一些读物: JavaScript 中的对象比较- 它是重复的,但它和重复的帖子包含大量信息。

这种比较的另一种方法是使用 jQuery.is()方法。如果使用得当,它会非常强大。它接受字符串选择器、函数、jQuery 对象或 DOM 元素引用。在像你这样的简单例子中,它可以很容易地使用(但我几乎觉得它太多了,因为需要创建一个 jQuery 对象并由 完成额外的处理.is())当你可以使用===它时,它也是有效且可靠的......虽然.is()更具可读性。以下是它的使用方法:

$('#first').on('click', function(){
    var element = $(this);
    $('.myLink').each(function(i, el){
        if (element.is(this)) {
            alert(i + ' equals');
        }
    });
});

演示:http: //jsfiddle.net/HEmB7/2/

参考:

于 2013-06-09T05:20:54.647 回答