2013-06-23 87 views
1

我在頁面上有一個介紹,當按下某個鍵或某個元素被點擊時,它將消失。我將爲這兩個事件使用相同的功能,但由於頁面被大量修改,事件只應觸發一次,無論觸發哪種方式。對於不同元素上的不同事件,具有相同功能的jQuery.one()

我的功能:

function start() { 
    $('.intro').remove(); 
    $('.something-else').show(); 
} 

如何我綁定的事件:

$('body').keypress(start); 
$('.intro').click(start); 

如果事件是相同的,我可以說

$('body, .intro').one('click', start); 

如果這兩個事件是發生在我可以說相同的元素:

$('.intro').one('click keypress', start); 

如何將兩者結合:具有不同的元素和不同的事件,並且該函數只能被調用一次?

+0

我想你可以使用一個'()'而不是'在()'這個 – landons

+1

原帖說一個(),但阿什溫編輯它的(),這是不對的。 –

+0

啊。我把它推回 – landons

回答

0

我不認爲這個解決方案是一個乾淨的明確辦法,但使用的.one().trigger()的組合來完成。因爲您在其中一個綁定項上調用$(".intro").remove(),所以事件處理程序隱式解除綁定。 Sample Fiddle

不包括在小提琴中看到的html,這是代碼。

// Your event handler 
function start() { 
    $("#intro").remove(); 
    $("#main").show(); 
    console.log("start handler called"); 
} 

// Handle the keypress event 
$("body").one("keypress", start); 

// Allow user to click through the intro, but trigger the keypress handler on the body which is a one-time event handler) 
$("#intro").one("click", function() { $("body").trigger("keypress"); }); 
1

最簡單的解決方案是存儲您的函數是否被調用。

var started = false; 
function start() { 
    if(started) return; 

    $('.intro').remove(); 
    $('.something-else').show(); 

    started = true; 
} 

然後你的函數只能被調用一次,其他的調用都會被忽略。

+0

同樣適用於這裏。使用標誌變量是絕對有可能的。我不認爲這是完全可能的,但讓我們假設用戶碰巧點擊並同時按下一個鍵:你認爲這是線程安全的嗎? –

+0

是的,我認爲是。我認爲代碼不可能同時執行兩次。 –

+0

@dboehmer JavaScript是單線程的,事件被添加到隊列並按FIFO順序執行。單擊事件和按鍵事件無法同時觸發。 –

0

使用兩行代碼來完成;)

$('body').one('keypress', start); 
$('.intro').one('click', start); 

編輯: 您應該手動取消綁定其他的回調,以免以後運行時,意外。

+0

那麼,我當然知道我可以做到這一點。問題的意圖是將事件處理轉移到jQuery。我發現'one()'非常有用,並希望在我的情況下可以使用它。 –

相關問題