2013-07-03 127 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