2012-04-16 58 views
2

我有一個已經有onclick事件和分配函數的按鈕。我希望在它前面添加另一個函數調用。我可以想象應該可以擺弄onclick屬性(attr),但我不認爲這是最佳做法。使用JQuery預先在按鈕上執行onclick動作

你認爲最好的做法是在現有的onclick事件上預先調用一個函數嗎?

+0

[jQuery事件的可能的重複:預先回調處理程序已經存在](http://stackoverflow.com/questions/9052349/jquery-events-prepend-a-callback-handler-to-already-existing -ones) – 2014-04-14 14:01:52

回答

7

如果你不怕惹的jQuery的膽量:

// "prepend event" functionality as a jQuery plugin 
$.fn.extend({ 
    prependEvent: function (event, handler) { 
    return this.each(function() { 
     var events = $(this).data("events"), 
      currentHandler; 

     if (events && events[event].length > 0) { 
     currentHandler = events[event][0].handler; 
     events[event][0].handler = function() { 
      handler.apply(this, arguments); 
      currentHandler.apply(this, arguments); 
     }  
     } 
    }); 
    } 
}); 

$("#someElement").prependEvent("click", function() { 
    whatever(); 
});​ 

親身體驗:http://jsfiddle.net/Tomalak/JtY7H/1/請注意,必須已有currentHandler或該函數將不會執行任何操作。

免責聲明:我認爲這是一個破解。這取決於jQuery內部結構,這可能會在下一個版本的庫中發生變化。它現在可以工作(我測試了jQuery 1.7.2),但是如果它與未來版本的jQuery打交道,不要感到驚訝。

+0

這真棒... – 2012-04-17 14:22:34

+0

我花了最後3個小時試圖「預先安排一個事件」。 @Tomalak,你搖滾! – frnhr 2012-10-22 06:10:36

+1

'//任何',真的:-) – 2014-03-25 06:01:18

1

您可以在單個事件上添加功能,但我嘗試避免onclick事件的兩個函數。相反,您可以
1.在現有功能中添加新代碼。
2.從現有功能添加對新功能的調用。

-2

如果你已經綁定這樣

$(elem).on('click', functionName); 

事件中,你可以修改,像這樣:

$(elem).on('click', function(){ 

anotherFunctionNameOrWhateverYouWant(); 

functionName(); 
}); 
+0

那不[work](http://jsfiddle.net/n2eaq/1/)。 'functionName'將被調用兩次 – noob 2012-04-16 07:09:19

+0

是的。在小提琴你實際上調用它兩次..我寫了修改:-)只需刪除小提琴中的第一行,它會沒事的。 – simekadam 2012-04-16 09:10:47

+0

但他問他如何可以預先安排事件時,第一個已經存在,而不是他如何才能添加兩個事件...甚至有更好的方法比你提到要做到這一點。 – noob 2012-04-16 11:00:17

0

我不認爲有一種方式來預先考慮在現有的函數調用的onclick事件,但你可以試試這個:

$('#foo').unbind('click'); 
$('#foo').click(function() { 
    // do new function call.. 
    // call original function again... 
}); 

希望有所幫助。

+1

哎呀錯過了..你絕對正確@micha – marknatividad 2012-04-16 07:04:50

+0

我可以以某種方式'獲取'當前的點擊方法,解除綁定,打電話給我自己的方法,然後調用已經在點擊方法中的「無論」? – 2012-06-05 11:08:17

5

我已經寫在這裏短暫example

​$("button").click(function() { // this is already existing 
    if ($("span").length) { 
     alert("ok"); 
    } 
}); 

var clicks = $("button").data("events").click.slice(); 
$("button") 
    .unbind("click") 
    .click(function() { // this is the new one which should be prepended 
     $("body").append($("<span>")); 
    }); 
$.each(clicks, function(i, v) { 
    $("button").click(v); 
});