Javascript 如何在文本区域按住一个键时仅显示一个键

Javascript 如何在文本区域按住一个键时仅显示一个键,javascript,jquery,Javascript,Jquery,当一个键按下较长时间时,是否有可能只显示一个字符?我的意思是,当我按下lets say’s’DOWN较长时间时,我只想显示“s”,我不想出现“sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss

当一个键按下较长时间时,是否有可能只显示一个字符?我的意思是,当我按下lets say’s’DOWN较长时间时,我只想显示“s”,我不想出现“ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss

使用这种方法会导致一个问题,即如果用户快速键入并同时按下两个键,则只会显示第二个键,例如,如果我按下“k”并按下“whit out”使“k”消失,则只会显示“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天

这是我基本上想做的,但我不明白你按下一个键,只有一个显示出来的部分是如何完成的,当然,如果我按下一个键,同时按下另一个键,这两个键都显示出来,剩下的部分很容易


所以我很乐意解释它让我发疯。

好吧,我想我明白了

1:按下键取消对文本区域的输入

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
}
下面是代码(有注释,您可以看到发生了什么):
好的,我想我明白了

1:按下键取消对文本区域的输入

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
}
下面是代码(有注释,您可以看到发生了什么):

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

…但是如果你必须这样做:

您可以使用
keyDown
事件让事件通过,条件是它后面跟着
keydup
事件。下面的代码是

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


另一个注意事项:此代码添加到
文本区域
。因此,如果按下
delete
键,它将尝试添加a
delete
,而该操作不起任何作用。你可以做一个
事件.keyCode
过滤,看看它是否是一个字母,然后再摆弄
事件本身,就像Michael建议的那样。

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

…但是如果你必须这样做:

您可以使用
keyDown
事件让事件通过,条件是它后面跟着
keydup
事件。下面的代码是

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


另一个注意事项:此代码添加到
文本区域
。因此,如果按下
delete
键,它将尝试添加a
delete
,而该操作不起任何作用。你可以做一个
事件。keyCode
过滤,看看它是否是一个字母,然后再摆弄
事件本身,就像Michael建议的那样。

我在大学里,这是为了学习。严肃地说,这只是猜测,没有任何测试,如果你有一个布尔值,比如var keyreased=false;然后在你的keydown中实现它,然后在keydup中用if(keydreleased)包装逻辑,请不要这样做。永远不要更改应用程序中的输入行为。这只会让你的用户感到困惑。例如,如果出于某种原因,用户需要它,则有系统范围的设置来更改行为。如果我使用或不使用,我仍然希望了解它是如何完成的。我在大学里,这是为了学习。严肃地说,这只是猜测,没有任何测试,如果你有布尔值,like-var-keyreased=false;然后在你的keydown中实现它,然后在keydup中用if(keydreleased)包装逻辑,请不要这样做。永远不要更改应用程序中的输入行为。这只会让你的用户感到困惑。例如,如果出于某种原因,用户需要它,则有系统范围的设置来更改行为。如果我使用或不使用,我仍然希望了解它是如何完成的。这仅在
keyUp
上打印字符。它修改了任何文本字段的正常使用方式。但仅在
keyUp
上打印字符。它修改任何文本字段的正常使用方式。