如果我在textarea中按住键,如何只显示一个键

时间:2012-12-13 19:23:41

标签: javascript jquery

当按下一个键 DOWN 更长时间时,是否有任何可能的方法只显示一个字符我的意思是当我按下时让我们说's' DOWN 在更长的时间内我只想's'显示,我不希望这种情况发生'ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss .......

然后使用这种方法,因为这会带来这样的问题:如果用户快速键入并同时按下两个键,则只会显示第二个键,例如,如果我按下“k”并按下白色键让'k'进入'p'只显示'p'。

var textarea='';

document.getElementById('textareaID').onkeydown=keydown;
document.getElementById('textareaID').onkeyup=keyup;

function keydown () {

this.value=textarea;

}

function keyup () {
textarea=this.value;
this.value=textarea;

}

请不要说使用计数器,因为它因某些原因无效,相信我已经尝试了3天。

http://toki-woki.net/lab/long-press/这就是我基本上想要做的事情,但是我无法理解你按住键的部分是如何显示出来的,当然如果我按下一个键然后键我按下另一个,他们两个都显示休息很容易。

所以我会喜欢并解释它让我疯狂。

2 个答案:

答案 0 :(得分:5)

好吧,我想我明白了。

1:在keydown上取消对textarea的输入。

2:在点击的字母中输入密钥。

document.getElementById('textareaID').onkeydown=keydown;
document.getElementById('textareaID').onkeyup=keyup;

// keydown is run more than once if held down hence "ssssssss"
function keydown (event) {
    // cancel input
}
// since the keyup event is only fired once we will do most of the work here
function keyup (event) {
    // insert input
}

这是代码(有评论,所以你可以看到发生了什么): http://jsfiddle.net/NerfAnarchist/gXVuC/

答案 1 :(得分:1)

正如评论者PA指出的那样,我认为改变文本框或textareas的原生行为是不好的做法。在执行此操作之前,请先查看其他选项。

...但 IF 你必须这样做:

您可以使用keyDown事件让事件在keyUp事件之后传递。以下代码为based on this fiddle

​document.getElementById('box').addEventListener('keydown', function(event){
    // Superglobal window.characterPrinted to detect if the event has already fired.
    if(window.characterPrinted != true){
        window.characterPrinted = true;
        this.value += String.fromCharCode(event.keyCode);
        event.preventDefault();
    }
})​​​​​​​​;

document.getElementById('box').addEventListener('keyup', function(event){
    // Reset superglobal
    window.characterPrinted = false;
});

请注意,此代码使用addEventListenerpreventDefault,但不保证可以在旧版浏览器中使用。您需要使用不同的方法绑定事件。 (我看着你,IE7)。

另一个注意事项:此代码 添加到textarea。因此,如果按下delete键,它会尝试添加一个delete,它什么都不做。您可以进行event.keyCode过滤,以便在摆弄event之前查看它是否是一封信,就像迈克尔建议的那样。