2013-09-23 27 views
2

我想在函數執行前在.click(function(){...})處理程序中編寫延遲。這不起作用:JQuery .click()處理程序無法接受函數週圍的setTimeout()

$('.okButton').click(setTimeout(function() { ...}, 3000)) 

它給這個錯誤(在Chrome):

Uncaught TypeError: Object 2 has no method 'apply' 

jQuery的文檔不給任何線索,爲什麼這是行不通的。

如何在執行函數處理程序之前放置延遲?

回答

1

解決的辦法是有一個。點擊()處理函數,僅僅在手柄真正的處理程序函數調用的setTimeout():

$('.okButton').click(function() { 
     setTimeout(okButtonClickHandler, 3000) 
    }); 

當我試圖在此之前它被稱爲處理函數立即使用,因爲我在setTimeout()的參數上包含括號。

不要這樣做:

$('.okButton').click(function() { 
     setTimeout(okButtonClickHandler(), 3000) 
    }); 

它會立即執行處理函數。

6

它不起作用,因爲setTimeout()沒有返回函數;它會返回一個定時器句柄(一個數字)。

這應該工作:

$('.okButton').click(function() { setTimeout(function() { ...}, 3000); }); 

在JavaScript函數調用的參數表達式總是充分評估之前被調用的函數。你的代碼叫做setTimeout(),並且它的返回值被傳遞給了jQuery例程。

+0

這個和其他類似的例子不起作用,因爲JS立即執行整個處理程序,然後在指定的時間之後在setTimeout()中執行函數參數。 setTimeout()不會延遲處理處理程序的其餘部分,直到超時。 –

+0

@DeanSchulze我不明白你的意思。你試圖推遲一個「點擊」處理程序的建立,還是你想讓「點擊」處理程序設置一個計時器,以便在「點擊」之後3秒發生什麼?如果是後者,那麼這絕對是你如何做到的。我會做一個jsfiddle來演示。 – Pointy

+0

@DeanSchulze [這是一個jsfiddle。](http://jsfiddle.net/yQjM9/) – Pointy

1

爲什麼不把超時放在回調中?

$('.okButton').click(function() { 

    setTimeout(function(){ 
    alert("Hello"); 
    },3000); 

}); 
0

你可以這樣做:

$(".okbutton").click(function(event) { 
    var timeout = setTimeout(function() { 
     alert("Foo"); 
    }, 3000) 
}); 

你可以嘗試一下working example。單擊單擊單詞後,警報將顯示三秒鐘。

相關問題