2013-01-02 52 views
2

我現在有一個文本框,我就重點調用鍵盤筆畫避免多個事件監聽器:從.focus

$myTextBox.on('focus', function(e){ 
    $(document).keydown(function(e){ 
     if(e.which==13) 
     e.preventDefault() 
    }); 
    $(document).keyup(function(e){ 
     if(e.which ==13) 
     alert("hey"); 
    }); 
}); 

如果我點擊這個多次按下「確認」鍵後會引起許多警報,怎麼我可以避免這種情況,只有它纔會被調用一次。

回答

1

您每次獲得焦點時都添加事件偵聽器。

只需添加的keydown,KEYUP聽衆對文件準備好功能......

$(function() { 
    $("#myTextBox").keydown(function(e){ 
     if(e.which==13) 
     e.preventDefault() 
    }); 
    $("#myTextBox").keyup(function(e){ 
     if(e.which ==13) 
     alert("hey"); 
    }); 
});​ 

http://jsfiddle.net/ShHkP/

-1
var alreadyPressed = false; 
    $("textarea").keypress(function (e) { 
     if (e.which == 13) { 
      e.preventDefault(); 
      alreadyPressed = true 
     } 
    }); 
    $("textarea").keyup(function (e) { 
     if (e.which == 13 && !alreadyPressed) { 
      alert("hey"); 
      alreadyPressed = false; 
     } 
    }); 

http://jsfiddle.net/DerekL/Dr6t2/

+0

您的KEYUP/KEYDOWN偵聽器添加到整個文檔? –

+0

@ Calvin.Allen - 是的。 –

+0

爲什麼會有downvote?我討厭人們在回答問題時只是低頭,並沒有提供一個理由。 –

-1

我看到你想要做什麼(或不?)。您只需將事件附加到表單並排除textarea,而不是在每次輸入焦點時將其添加到文檔中。

$('form').on('keydown', function(e) { 
    // Prevent submit when pressing enter but exclude textareas 
    if (e.which == 13 && e.target.nodeName != 'TEXTAREA') { 
    e.preventDefault(); 
    } 
} 
+0

他甚至沒有提到textarea,只是文本框。 –

+0

我認爲這只是語義... – elclanrs

0

像其他人說的,你不必繼續focus添加事件。同樣,您應該將事件附加到文本框本身,因爲事實上,當您將事件添加到焦點時,實際上就是這樣做的。

$myTextBox.on({ 
    'keydown': keyDown, 
    'keyup': keyUp 
});​ 

,以便應用程序不會進入一個進入警報-OK環,你有alert()調用之前關閉KEYUP偵聽器,然後擊中確定後重新打開。

Here's a fiddle.