2014-10-30 27 views
0

我在keydown上使用.one()函數來停止此運行中的函數,如果用戶按住鍵。jQuery .one()只在頁面上運行一次

問題是,.one()函數只運行一次,並且只能在刷新頁面時再次運行。

$(document).one('keydown',function(e){ 
    if (e.keyCode == 37) { 
     prev(); 
     return false; 
    } 
}); 

有沒有辦法解決這個問題,或者一種替代方法?

我得到.one()表示一次,而且這是函數的重點。我試圖讓它每個keydown運行一次。

+4

'one()'就是這樣命名的,因爲它只會觸發一次。你嘗試過'()'嗎? – Ski 2014-10-30 13:09:00

+0

我明白了,但是希望每個'keydown'運行一次。 .on()在按住鍵的情況下多次運行該函數。 – ccdavies 2014-10-30 13:10:36

+0

[如何在jQuery中禁用重複的keydown](http:// stackoverflow。com/questions/9098901/how-to-disable-repetitive-keydown-in-jquery) – PeterKA 2014-10-30 13:28:58

回答

1

你可以使用事件的timeStamp屬性,如果時間差太短與前值和return false比較 - 重複鍵。但是,你需要使用.on()

var t = Date.now(); 
 
$(document).on('keydown',function(e){ 
 
    if(e.timeStamp - t < 100) { 
 
     t = e.timeStamp; 
 
     $('pre.out').append((e.timeStamp - t) + ': Bad\n'); 
 
     return false; 
 
    } 
 
    t = e.timeStamp; 
 
    if (e.keyCode == 37) { 
 
     $('pre.out').append('Bad\n'); 
 
     return false; 
 
    } 
 
    $('pre.out').append('Good\n'); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" name="test" /> 
 
<pre class="out"></pre>

UPDATE:

請在類似的問題我們來看一看:

  1. How to disable repetitive keydown in jQuery
  2. jQuery keypress event fires repeatedly when key is held - but not on all keys
  3. Stop key from repeating on hold. (jQuery)
1

簡單的黑客:

var pressed = false; 
$(document).on('keydown',function(e){ 
    if (e.keyCode == 37 && !pressed) { 
     pressed = true; 
     prev(); 
     return false; 
    } 
}); 

然後你只是想確保你的一套pressed = false;再次,如果你想再次調用該函數prev()(也許在pev()函數結束......)。這可能會發生onkeyup

$(document).on('keyup',function(e){ 
    pressed = false; 
}); 

這真的取決於您的需求。

1

一個人只是你希望它是什麼,它運行一次!這實際上是防止人們雙重提交表單等非常好的方法,但需要一個稍微不同的設計。我發現它是最容易在這裏使用一個命名函數自己,試試這個

function handle_key_down_event (e) { 
    if (e.keyCode == 37) { 
     prev(); 
     return false; 
    } 
    document.one('keydown',handle_key_down_event (e)); 
} 
document.one('keydown',handle_key_down_event (e)); 

通過重申在函數結束的聲明,你再重新設置。要記住的一個小竅門是,如果你正在做異步操作(主要是ajax)操作,你可能希望重新綁定調用在回調結束時而不是函數。

編輯:在閱讀您的評論之後,可能最好的地方就是在鍵控監聽器中進行重新綁定。

+0

謝謝。任何想法,爲什麼我會得到「E沒有定義」? – ccdavies 2014-10-30 13:23:58