为什么这两种编写jQuery插件的方法是等价的
Why are these two ways of writing a jQuery plugin equivalents?
为什么这两种编写jQuery插件的方法是等价的?
第一种方式:
$.fn.myplugin = function () {
return $(this).each(function() {
return $(this).bind('click', function () {
console.log('Hi');
});
});
};
第二种方式:
$.fn.myplugin = function () {
return this.bind('click', function () {
console.log('Hi2');
});
};
让我们从一个减少到另一个:
$.fn.myplugin = function () {
return $(this).each(function() {
return $(this).bind('click', function () {
console.log('Hi');
});
});
};
当你启动你的函数this
是一个jQuery对象,所以$(this)
不会给你买任何东西,它很容易变成:
$.fn.myplugin = function () {
return this.each(function() {
return $(this).bind('click', function () {
console.log('Hi');
});
});
};
所以您说"对于jQuery对象中的每个元素,创建一个jQuery对象并将一个事件绑定到该对象。"
如果您查看bind
,它会调用on
,它执行一些逻辑并最终执行以下行:
return this.each( function() {
jQuery.event.add( this, types, fn, data, selector );
});
这意味着它将把事件应用到jQuery对象中的每一个元素,所以你实际上是在说:
因此,您说"对于jQuery对象中的每个元素,创建一个jQuery对象,并为该jQuery对象中的每一个元素绑定一个事件到该元素。"
现在循环两次,一次在N
元素列表中,然后在1元素列表中循环N
次。实际上,你可以直接绑定所有内容:
$.fn.myplugin = function () {
return this.bind('click', function () {
console.log('Hi2');
});
};
当然,这是最后的代码。
在您的情况下,除了您在第一个代码段中创建了一个新的jQuery对象之外,没有什么真正的区别(this
是一个jQuery对象,因此不需要使用$(this)
)。
一般来说,在插件函数中使用return this.each(...);
是一个好主意,以保持所有内容都是可链接的,并使您的代码能够工作,无论调用插件函数的jQuery对象中有多少元素。
返回this.bind(...)
也保持了可链接性,但对于一个不仅绑定事件的更复杂的插件,each
循环通常更具可读性。
两者之间根本没有区别。
只是出于某种原因,在其中一个循环中,你正在进行循环,但最终,它们会得到相同的结果。
this
是jQuery对象,所以执行$(this)
没有任何作用。
.bind
将处理jQuery对象中的所有元素,当您执行.each
时,您将分别对每个元素调用.bind
。
因此,它们是等价的,因为它们都在元素上循环并将事件绑定到元素。
我建议用第二个,它更干净更快。
- jQuery插件-从插件中调用公共方法
- jquery插件或javascript方法自动调整文本输入(而非文本区域)(固定宽度)可变高度的大小
- 有没有一种方法可以从光滑的网格访问插件
- 将方法插入jQuery插件
- 如何在jQuery插件中创建一个公共方法
- 重写jQuery插件方法
- 无法调用方法'应用'关于为jquery谷歌地图插件设置方向的未定义
- 有没有一种方法可以重新绑定jQuery插件中引用的事件处理程序
- 如何使用jQuery扩展方法为元素或类选择器创建自定义插件
- jQuery插件作为指令,并在插件上调用公共方法
- jQuery验证插件-比较两个选择下拉列表的自定义方法
- 从jQuery select访问插件方法
- 有没有一种方法可以在运行中添加CKEditor的按钮到链接插件
- 如何使用jquery cookie插件保存toggleClass方法的状态
- 可以't从客户端应用程序引用插件中定义的静态方法
- 为什么这两种编写jQuery插件的方法是等价的
- 插件中的元素不接受 jQuery 方法
- XrayWrapper 错误(值是可调用的)在 Firefox 插件中覆盖原型方法时
- 如何使函数在整个 jQuery 插件及其所有内部方法中可用
- Javascript模块模式:如何将方法/插件注入/创建/扩展到我们自己的库中