为啥在 jQuery 插件中返回 this.each(function())?

Posted

技术标签:

【中文标题】为啥在 jQuery 插件中返回 this.each(function())?【英文标题】:Why return this.each(function()) in jQuery plugins?为什么在 jQuery 插件中返回 this.each(function())? 【发布时间】:2011-02-10 07:32:31 【问题描述】:

我看到的一些开发 jQuery 插件的教程和示例往往会返回

this.each(function () 
    //Plugin code here
);

在实例化插件的函数的末尾,但我还没有看到它背后的任何推理,它似乎是每个人都遵循的标准。谁能告诉我这种做法背后的原因?

编辑:为了澄清,我的问题不是为什么要返回 this,而是为什么插件应该返回 this.each。

【问题讨论】:

这很奇怪。似乎只返回this 会是一个更好的主意.. @Walt W - 我同意。我理解为什么我们会返回这个,因为这与流畅界面的想法保持一致。但我不明白的部分是每次调用。 澄清一下,你写的函数是空白的吗?还是里面有代码? @Walt w - 不,功能不是空白的,我应该澄清一下。我将更新我的代码示例。 【参考方案1】:

当您使用选择器 ($('.myclass')) 过滤元素时,它可以匹配多个元素。 使用each,您可以遍历所有匹配的元素,并将您的代码应用于所有这些元素。

【讨论】:

当然!谢谢,我想我以前每次使用插件时都认为这是理所当然的。 虽然这绝对正确,但return 的实际原因是允许链接... @Mef:嗯,我认为这很清楚,更多的是关于为什么使用each 如果您有想要在 .each() 循环之后运行一次的代码,您可以在循环和最后运行代码之后“返回”吗?【参考方案2】:

jQuery 支持“链式方法”,这意味着大多数 jQuery 函数应该返回this.each() 返回this,如果你想让$('selector').yourPlugin().css(...) 工作,你应该return this

【讨论】:

这是正确答案。您返回的原因是允许可链接性。【参考方案3】:

让我向您展示两个“等效”的代码,可以澄清您的问题:

使用 jQuery “each”函数:

(function($) 
    $.fn.mangle = function(options) 
        return this.each(function() 
            $(this).append(' - ' + $(this).data('x'));
        );
    ;
)(jQuery);

没有 jQuery “each” 函数:

(function($) 
    $.fn.mangle = function(options) 
        var objs = this;
        for (var i=0; i<objs.length; i++) 
            var obj = objs[i];
            $(obj).append(' - ' + $(obj).data('x'));
        ;
        return this;
    ;
)(jQuery);

所以,基本上,each 函数用于将一些代码应用于包含在 this 对象中的所有元素(this 通常是指由 jQuery 选择器返回的一组元素 ) 并返回对this 的引用(因为each 函数总是返回该引用-以允许链接调用-

附注:第二种方法 (-for loop-) 比前一种方法 (-@ 987654329@函数-)。

【讨论】:

【参考方案4】:

当您编写插件时,您正在扩展 jQuery 对象,并且由于 jQuery 对象是一个序列,您返回 this.each(function () ); 以便您的插件针对序列的每个项目执行。

【讨论】:

但您实际上只是返回“一个”“这个”,对吗?每个部分都是独立的,不是吗? @Marcel:是的,实际上你可以调用each,然后返回this,作为两个单独的语句。它之所以有效,是因为 each 也返回 this【参考方案5】:

简而言之,它允许您利用链接,因为它返回到目前为止已经完成的所有内容,因此下一个 .anyMethod() 可以对更改/修改的元素进行操作。

此外,看看这些链接,它们会给你很多关于 jQuery 插件开发的信息。

http://www.webresourcesdepot.com/jquery-plugin-development-10-tutorials-to-get-started/ http://www.learningjquery.com/2007/10/a-plugin-development-pattern http://snook.ca/archives/javascript/jquery_plugin

这里有一个不错的基于 Web 的应用程序,可以帮助您快速启动 jQuery 插件。 http://starter.pixelgraphics.us/

【讨论】:

以上是关于为啥在 jQuery 插件中返回 this.each(function())?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到一个未定义的回报?

为啥灯箱 jQuery 插件对我不起作用?

为啥这个 dataTables jQuery 插件 (TableTools) 不工作?

为啥 jquery select.val() 在 AngularJS 环境中返回类型:值?

jQuery 插件可由控制台触发,但不能由函数触发 - 为啥会这样?

为啥当我使用 jQuery 自定义插件将 src 添加到图像时,段落会向下移动?