2012-09-05 33 views
3

可能重複:
How can I remove the event handler once the click event has fired?如何讓按鈕可以點擊一次?

我試圖使用實時點擊事件指派給一個按鈕,希望用戶只能觸發它只有一次。有沒有辦法做到這一點?

//I only want the alert show once and disable the click event... 
$('#testBtn').live('click', function(){ 
    alert('hey ya'); 
}) 

請注意:按鈕是動態創建的。

+1

請看這個http://api.jquery.com/one/ –

+0

請更新您的問題,清楚地表明您正在使用,因爲元素是動態創建的。 – Archer

+0

我已經在這裏爲您測試了哪些測試用例最快 - http://jsperf.com/one-event –

回答

8

您可以使用one()並委派處理程序,以及(在jQuery的1.7+)和像這樣的東西替換過時live()功能:

$(document).one('click', '#testBtn', function(){ 
    alert('hey ya'); 
}); 

用最接近的非動態父代替換document

+0

+1這是做到這一點的正確方法。這將適用於動態創建的元素(我的答案在這種情況下不起作用),並且,看起來,這是@Rouge想要實現的。 – Zbigniew

+0

謝謝+1。如果testBtn是一個類,該怎麼辦?它似乎不工作,如果我在一個函數內使用類 – Rouge

+0

那麼這使用ID選擇器('#'),只需將它替換爲類選擇器('.'):'.testBtn' – Zbigniew

4

可以使用one功能:

$('#testBtn').one('click', function(){ 
    alert('hey ya'); 
}) 

演示:http://jsfiddle.net/SEjYK/

+0

並且使用動態元素,它的工作原理與此類似[FIDDLE](http://jsfiddle.net/SEJYK/1 /),完全沒有? – adeneo

+0

我不能使用.one因爲我有.live方法。任何解決方法? – Rouge

+0

@Rouge - 請參閱下面的答案! – adeneo

0

使用one()

$('#testBtn').one('click', function(){ 
    alert('hey ya'); 
}) 
0
$('#testBtn').one('click', function() { 
    alert('hey ya'); 
}); 

希望這有助於!

編輯:如果你絕對要使用「現場」:

$('#testBtn').live('click', function() { 
    $(this).die('click'); 
    alert('hey ya'); 
}); 

如果你想使用「一」只是運行第一代碼片段你產生的動態對象之後,並追加到文件。

如果您使用的是「活」式的做法,雖然我會建議使用「上」,因爲現場已經過時:

$(document).on('click', '#testBtn', function() { 
    $(this).die('click'); 
    alert('hey ya'); 
}); 
+0

我有.live和testBtn是動態生成的... – Rouge

+0

更新了我的文章 –

-1

你可以用解除綁定刪除所有點擊事件:

$('#testBtn').unbind('click'); 
$('#testBtn').unbind('live'); 
+0

這不會爲通過'live()連接的處理程序工作;你想'死()'的。 – Matt

0

你可以這樣來做這可能運行速度最快的..要檢查與jsperf.com

$('#testBtn').bind('click', function() { 
     $(this).unbind('click'); 
     alert('Clicked and unbound!'); 
});​ 

http://jsfiddle.net/usZSU/

編輯:我想這將運行速度最快的加3測試用例 - http://jsperf.com/one-event 運行2-3次,以獲得最佳結果..每次我運行它綁定是最快的,一個是3%慢。

+0

如果它不能與動態元素一起工作,它有多快? – adeneo

+0

爲什麼不呢?所有你需要做的就是改變綁定生活,你仍然可以解除綁定事件。如果你希望動態和快速,我還會使用普通香草JavaScript和addEventListener(「click」)。生活和死亡是測試案例中最慢的。 –

+0

恩,杜,你在比較蘋果和橘子!你正在比較你的答案和'bind()',它根本不適用於動態元素,而是委託給'one()'和'live()'的版本!當然,委託處理程序會比較慢,但如果更快的'bind()'方法根本不適用於動態元素,那麼這不是問題。 – adeneo

0

在這個頁面上有更多明智的答案,但如果你堅持使用.live()而不是one()那麼這將做你所要求的...

//I only want the alert show once and disable the click event... 
$('#testBtn').live('click', function(){ 
    $(this).die('click'); 
    alert('hey ya'); 
}); 

.die('click')將刪除點擊事件處理程序,因此它不會再次觸發。

0

最好的選擇是使用.one而不是live來作爲按鈕。這更有意義.. 如果你不想使用它,那麼你可以在你的頁面中使用一個Hiddenfield,當點擊事件被觸發,然後設置標誌值。

下一次當你點擊按鈕檢查對於標誌值,如果它已經被執行一次然後不要運行裏面的代碼吧..

檢查這個例子http://jsfiddle.net/sushanth009/Fakb5/

還要注意的是.live在目前的jQuery的版本已經過時了。最好使用.on()代替