2013-07-03 94 views
0

我正在开发一个具有回调函数的自定义jquery插件。 我已分配插件2不同元件等Jquery自定义插件回调

$("#id01").plug({ 
onsave: function(res) { console.log(res); } 
}); 

$("#id02").plug({ 
onsave: function(res) { console.log(res); } 
}); 

如果我使元件1的任何变化和点击保存,回调函数的OnSave()将触发两个元件。请帮我解决这个问题。

下面是示例代码:

(function($){ 
    $.fn.plug = function(options) { 
     var param = $.extend({ 
      selector: this.selector, 
      onsave: function() {} 
     }, options); 

     $(".savebtn").live('click', function() { 
      if(typeof param.onsave == 'function') { 
       var data = value; 
       param.onsave.call(this, data); 
      } 
     }); 

    } 
}(jQuery)); 
+0

'live()'已过时。改用'on()'。 http://api.jquery.com/on/ – techfoobar

+0

你需要弄清楚如何判断每个事件属于哪个回调。 – SLaks

+1

很难猜测,因为我们没有足够的信息,但如果你的html看起来像这样:http://jsfiddle.net/beBpb/你的一个绑定2事件的保存按钮,这使2调用,它创建2控制台.log –

回答

2

所以,正如我所说的评论,你在选择做一个现场呼叫,你在2个元素结合2个事件,而我们应该绑定1个事件在2个元素上。在这里你应该怎么做。

首先创建一个VAR保存按钮,对焦功能外:

var saveBtn = $('<a/>', {href : '#', class : 'savebtn', text : 'Save'}); 

然后追加对焦点按钮:

$(parent).append(saveBtn); 

的结合应该是这样的:

saveBtn.bind('click', function() { 
    if(typeof param.onsave == 'function') { 
     var data = param.selector; 
     param.onsave.call(this, data); 
    } 
    return false; 
}); 

在一个插件中,你绝不应该打电话给一个jquery选择器,特别是当你ar动态创建它们。

这让我觉得,这条线:

$(param.selector).live('focus'... 

可以更改为:

this.bind('focus'... 

这是最佳的,它不是使用选择!

我差点忘了,这里的小提琴:http://jsfiddle.net/beBpb/9/


一个小侧面说明了“保存在一个VAR按钮”。这将允许您删除并添加按钮而不会弄乱绑定。它几乎优化了插件,因为直接绑定比委托绑定更快(live)。

另外,你可以轻松地删除保存按钮,当点击“保存”与this.remove()Fiddle)。这是为您的插件添加了一个很好的功能,并且由于您正在缓存按钮,所以在性能上比其他任何方面都好。

+0

谢谢,让我在我的插件中实现它,并检查它是否有效! – sravis

+0

当我追加元素我越来越[对象对象],所以我用.add(),它的工作。但在这里我遇到了新问题。当用户点击保存时,我正在用输入值替换父级html内容。通过这样做,BIND()只在第一次保存时工作正常。第二次,当用户获得相同输入的保存按钮,如果他点击它,BIND()不起作用。 即使LIVE()din't锻炼。所以我尝试了与DELEGATE()完全相同的senarieo,并且它的工作完美。 – sravis