我有一個javascript功能,當按下'down'鍵時運行。我想,如果'下'鍵被按下,該功能根本不會運行。區分按下按鍵和按鍵
我想過keydown和keyup之間的時間間隔,如果時間少於1秒,那麼函數將在keyup上運行。問題是,如果我按住鍵,瀏覽器會將它視爲連續按下多次的鍵。
有沒有更好的方法來做到這一點?
感謝
我有一個javascript功能,當按下'down'鍵時運行。我想,如果'下'鍵被按下,該功能根本不會運行。區分按下按鍵和按鍵
我想過keydown和keyup之間的時間間隔,如果時間少於1秒,那麼函數將在keyup上運行。問題是,如果我按住鍵,瀏覽器會將它視爲連續按下多次的鍵。
有沒有更好的方法來做到這一點?
感謝
如果我理解你的問題是,您的瀏覽器解釋的關鍵正在舉行多重的keydown事件。 你想要一個不同的事情發生,如果一個關鍵是舉行,而不是簡單地按下;你希望這種差異是基於你認爲應該構成「持有」關鍵的某個時間。 所以你需要通過跟蹤keyup事件來區分hold和press。下面的僞代碼將解決此問題:
在KEYDOWN:
if !yourBool
start timer
yourBool = true
上KEYUP:
if timer < yourTime
do something
yourBool = false
這工作,因爲計時器不會重新啓動,除非發生keyup事件。
現在...如果你的瀏覽器解釋密鑰保存爲:
的keydown,KEYUP,KEYDOWN,KEYUP .......
那麼你必須用這種方法的一個問題。
也許你可以觸發的keydown一個櫃檯上,然後收聽下一KEYUP。只要計數器超過5秒鐘,或無論您認爲多長時間,都可以啓動該功能。合理?
連續keydowns不會觸發一個keyup,因此可以區分它們。
http://jsfiddle.net/pimvdb/xMFGQ/
$('body').keydown(function() {
if(!$(this).data('timeDown')) { // if not pressed yet, save time
$(this).data('timeDown', +new Date);
}
}).keyup(function() {
var diff = new Date - $(this).data('timeDown'); // time difference
if(diff < 1000) { // less than one second
alert(123);
}
$(this).data('timeDown', null); // reset time
});
瀏覽器看到按鍵被按下很多次,但事件只發生在第一次按下時。
你想要的是從事件中,而不是keypressed
。
我剛剛寫了這個小小的腳本,它將按下的按鍵和按鍵下來的時間相差200毫秒。也許你可以使用它:
document.onkeydown = function(e){
var keycode = window.event ? window.event.keyCode : e.which;
if(keycode == 40){
var timer = setTimeout(function(){
alert('Down key held');
document.onkeyup = function(){};
}, 200);
document.onkeyup = function(){
clearTimeout(timer);
alert('Down key pressed');
}
}
};
我也有類似的問題。我想捕捉所有的「第一」keydown事件,但如果它們是一個關鍵被阻止的結果,則忽略連續的事件。不知道這是你想要的,但這裏有一種方法:
var repeat = false;
el.addEventListener("keyup", function() { repeat = false; });
el.addEventListener("keydown", function() {
if (!repeat) {
// Run your code.
repeat = true;
}
});
什麼是上下文?如果您在文本框中,在最後一次按鍵之前跟蹤輸入值是否有意義,然後檢查是否在下一個按鍵事件中添加了多個字符?只要在周圍釣魚...... – Guttsy
當第一個''keydown''事件觸發時(但不是如果它已經設置),你可以設置一個標誌(例如布爾變量),並且在''keyup''觸發時取消設置嗎? –