jQuery 选择器是否遍历所有元素?

Does jQuery selector iterates through all elements?

我的页面上有多个链接,我想为所有链接创建相同的事件处理程序。

在第一个示例中,我只使用了一个选择器,它为两个链接正确地创建了事件处理程序:

$(document).ready(function () {
    $('.link').on('click', function () {
        alert($(this).text() + ' was clicked');
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href='#' class='link'>Link1</a>
<a href='#' class='link'>Link2</a>

在第二个示例中,我遍历每个元素并为其中的每个元素创建事件处理程序:

$(document).ready(function () {
    $('.link').each(function(){
      $(this).on('click', function(){
        alert($(this).text() + ' was clicked');
      });
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href='#' class='link'>Link1</a>
<a href='#' class='link'>Link2</a>

两者产生相同的结果,但为什么呢? jQuery 选择器是否已经遍历了所有元素? jQuery 选择器 总是 遍历所有元素还是仅在某些情况下?

您要查找的概念称为 Implicit iteration

jQuery Documentation 中提到 .each():

Note: most jQuery methods that return a jQuery object also loop through the set of elements in the jQuery collection — a process known as implicit iteration. When this occurs, it is often unnecessary to explicitly iterate with the .each() method.

使用 $('.link') returns 选择来选择某些东西,这就像满足选择器中列出的条件的项目列表(带有 class link 的元素在这种情况下)。选择本身不会遍历任何内容,它只是为您提供一个项目列表。

根据您之后对选择所做的操作,可能会发生隐式迭代。例如,大多数设置器就是这种情况(在您的情况下 .on())。设置器将迭代选择并应用于其中的所有项目。

不隐式迭代的函数(通常是 Getters)是您想要使用 .each() 自己迭代的地方,如果您需要它们 运行 在多个项目上。