2011-03-18 274 views
5

Heylo guys,Javascript onkeydown事件只触发一次?

我想有一个onkeydown事件只会触发一次函数。为使该功能再次触发,用户必须释放该键并再次按住。 我知道它很简单,但即时新的JS。另外我更喜欢避免使用jquery或其他库。 还有一件事,这应该适用于ie和Firefox。

非常感谢!

+1

请显示一些代码 – kjy112 2011-03-18 14:17:51

回答

13

你可以设置一个标志:

var fired = false; 

element.onkeydown = function() { 
    if(!fired) { 
     fired = true; 
     // do something 
    } 
}; 

element.onkeyup = function() { 
    fired = false; 
}; 

或者取消并重新绑定的事件处理程序(可能更好):

function keyHandler() { 
    this.onkeydown = null; 
    // do something 
} 

element.onkeydown = keyHandler; 

element.onkeyup = function() { 
    this.onkeydown = keyHandler; 
}; 

More information about "traditional" event handling.

你也可能需要使用addEventListenerattachEvent来绑定事件处理程序。欲了解更多信息,请看quirksmode.org - Advanced event registration models

0

JQuery的one将帮助你。

它的作用是将eventHandler绑定到事件上,并且当事件发生时,它运行eventHandler并解除绑定,以便在下一个事件中不触发它。

+1

*我宁愿避免使用jQuery或其他库*。而“一”本身并没有帮助。你必须重新绑定事件处理程序。 – 2011-03-18 14:21:35

2

在这里你去:

test.onkeydown = function() { 
    if (this.className === 'hold') { return false; } 
    this.className = 'hold'; 

    // call your function here 
}; 

test.onkeyup = function() { 
    this.className = ''; 
}; 

现场演示:http://jsfiddle.net/simevidas/xAReL/2/

0

下面是一个使用上jsfiddleaddEventListenerremoveEventListener

var textBox = document.getElementById("textBox"); 
function oneKeyDown(){ 
    $("body").append("<h1>KeyDown<h1>"); //just to show the keypress 
    textBox.removeEventListener('keydown', oneKeyDown, false); 
} 
function bindKeyDown(){ 
    textBox.addEventListener('keydown', oneKeyDown, false); 
} 
textBox.addEventListener('keyup', bindKeyDown, false) 
bindKeyDown(); 

代码示例的方法。

一注意,对于IE,您将需要使用attachEvent, detachEvent

+0

您应该注意,这只适用于Webkit和Firefox。 IE使用'attachEvent'。 – 2011-03-18 14:42:10

+0

分心,忘了提及它。感谢您的提醒。 – 2011-03-18 14:56:12

0

正如在其他答案中所述,没有'onkeyfirstdown'或类似的事件要监听。

最好的解决办法是跟踪哪些项已倒在一个JS对象:

var keysdown = {}; 

element.addEventListener('keydown', function(evt) { 
    if(!(evt.key in keysdown)) { 
    keysdown[evt.key] = true; 
    // key first pressed 
    } 
}); 

element.addEventListener('keyup', function(evt) { 
    delete keysdown[evt.key]; 
}); 

这样一来,你就不会,如果超过一个键被按下跳跃“keyfirstpressed”事件。

(这里发布的许多其他解决方案只会在没有其他按键关闭时触发)。