jQuery插件:某些代码应该只调用一次

时间:2010-10-20 17:30:47

标签: jquery

我正在尝试编写一个jQuery插件。为简单起见,我们可以说我的代码是

$.fn.myplugin = function() {
  return this.each(function() {
    $('a.mypluginToken').live('click', function(){})
  }
}

按照上面的代码,每次调用$('a')。myplugin时,由于'live'而对'click'事件进行绑定。我需要只进行一次绑定,而不是每个调用我的插件的元素。

一个解决方案是在绑定click事件后,我在文档上设置了一个数据“binding_done”。并且每次检查该数据。即使该解决方案能够工作,我想知道是否有更好的jQuery设计模式,我错过了。

感谢。

我正在使用jQuery 1.4.2

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的代码,当您致电$('a').myplugin时,您希望所有$('a.mypluginToken')都拥有点击功能吗?因为这没有任何意义。

首先,当您执行$('a.mypluginToken').live时,您说任何时候添加<a>mypluginToken,都会添加点击事件。所以没有必要继续调用这个插件。如果您只想绑定点击事件,请执行.bind('click', function() {})。或者,您可以在页面加载时调用$('a.mypluginToken').live一次并忘记它。

其次,如果主体只是选择你想要的所有东西,为什么要循环遍历选择器的每个元素呢?

如果你想要那件作品,你可以$('a.mypluginToken').unbind().bind('click', function() {})。这将确保每次绑定时,都没有附加事件。但是,此代码将删除当前绑定的所有事件,甚至是非单击事件。

是否尝试仅将点击附加到当前选择器中的课程mypluginToken?那你想要

function click_event() {};

$.fn.myplugin(function() {
    $(this).filter('.mypluginToken').unbind('click', click_event).bind('click', click_event);
}

将您的点击甚至功能拉出通话并引用它确保解除绑定只会取消绑定该功能而不是所有点击事件。

答案 1 :(得分:0)

你看过jQuery的内置.one()方法吗?我不确定它是否完全适合您的应用程序,但实质上它是一个事件处理程序,每个元素只会触发一次。