0

是否有任何可能的方法在长时间按下键时显示一个字符不希望这种情况发生'ssssssssssssssssssssssssssssssssssss....'。

并且不使用这种方法,因为这会带来一个问题,如果用户快速键入并同时按下两个键,则只会显示第二个键,例如,如果我按下“k”并按下而让“k” ' go '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/这是我基本上想要做的,但我不明白你按住键并且只显示一个的部分是如何完成的,当然如果我按下一个键,当键按下时,我按下另一个键,它们都显示出来,休息很容易。

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

4

2 回答 2

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/

于 2012-12-13T21:43:54.660 回答
1

正如评论者 PA 所指出的,我认为改变文本框或文本区域的本机行为是不好的做法。在执行此操作之前,请查看您的其他选项。

...但如果你必须这样做:

您可以使用keyDown事件让事件通过,条件是它后面有一个keyUp事件。以下代码基于此 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;
});

请注意,此代码使用addEventListenerand preventDefault,不能保证在较旧的浏览器中工作。您需要使用不同的方法绑定事件。(我在看着你,IE7)。

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

于 2012-12-13T21:53:42.510 回答