【问题标题】:How to record timing for keypress event?如何记录按键事件的时间?
【发布时间】:2013-05-09 12:32:25
【问题描述】:

我正在尝试构建一个小脚本,在回调时显示,当我按下键 q 然后一秒钟后我按下 w 它应该显示 qw 显然,但是 当我按下qw 时,我不会同时按下,不到一秒钟,它应该显示其他单个字符,例如:x,这就是我目前卡住的地方 JsFIDDLE 或我的完整代码。

<script type="text/javascript">
function check(e){
        var text = e.keyCode ? e.keyCode : e.charCode;

         switch(text){
         case 81:
            text = 'q';
            break;
        case 87:
            text = 'w';
            break; 
 }

    if(text == 8){

        var str = document.getElementById("out").innerHTML;
        var foo = str.substring(0, str.length -1);
        document.getElementById("out").innerHTML = foo; 
    }else {
        document.getElementById("out").innerHTML += text;
    }

    }

</script>
   <input  type='text'  onkeyup='check(event);' id='in' />
<div id='out' ></div>

我是 Javascript 的新手,我不知道什么可以让您记录一个按键,然后等待一秒钟内是否存在另一个按键。我也尝试过 setInterval() 函数,但它只会按给定的时间量执行函数。

【问题讨论】:

  • 这是你需要的fiddle吗?
  • 是的,也不是。 @Teemu 因为,当您在一秒钟内按下qw 时,它会显示qx 而不仅仅是x。你能检查一下吗?

标签: javascript dom javascript-events event-handling


【解决方案1】:

我认为这是你需要的:

var timer = new Date(),
    previousChar;

function check (e) {
    var foo,
        text = e.keyCode ? e.keyCode : e.charCode,
        out = document.getElementById('out'),
        str = out.innerHTML;
    switch (text) {
        case 81: text = 'q'; break;
        case 87: text = 'w'; break;
    }
    if (new Date() - timer < 1000 && text === 'w' && previousChar === 'q') {
        text = 'x';
        out.innerHTML = str.substring(0, str.length - 1);
    }   
    if (text === 8) {
        foo = str.substring(0, str.length - 1);
        out.innerHTML = foo; 
    } else {
        out.innerHTML += text;
    }
    previousChar = text;    
    timer = new Date();
    return;
}

jsFiddle 的现场演示。


编辑

由于您通过 cmets 添加了更多要求,因此这里是该任务的编辑代码:

var timer = new Date(),
    keyCombinations = {
        ae: 'ä',
        oe: 'ö',
            qw: 'x'
    };

function check(e){
    var text, str, previousKeys,
        key = e.keyCode || e.charCode,
        out = document.getElementById('out');

    text = String.fromCharCode(key);
    str = out.innerHTML + text;
    previousKeys = str.substring(str.length - 2, str.length);
    if (new Date() - timer < 1000) {
        if (previousKeys in keyCombinations) {
            str = str.substring(0, str.length - 2) + keyCombinations[previousKeys];
        }
    }
    out.innerHTML = str;
    timer = new Date();
    return;
}

请注意,此代码用于onkeypress 事件。从键码创建字符时更可靠。您可以在 onkeyup 处理函数中为特殊键分配单独的事件处理,例如 backspace

这不是一个完美的代码,但它给了你一个想法,如何实现这个任务。它使用对象文字来存储所有组合键及其替换。这样你根本不需要编写任何循环。

jsFiddle 上的一个活生生的例子。

【讨论】:

  • 这是有史以来最好的答案...一个问题,我正在尝试更改 200 多个字符,就像 qw 显示 x 有超过 200 个像 qw 这样会回显另一个字符,所以我的问题是无论如何最小化代码,而不是创建if (new Date() - timer &lt; 1000 &amp;&amp; text === 'w' &amp;&amp; previousChar === 'q') { text = 'x'; 200 次
  • @kranzdot 此代码仅适用于非常特殊的情况,例如您在问题中的情况。如果要检查多个组合键,则需要循环检查它们。你可以创建一个组合数组或……我会试试这个,看看我能做什么。
  • 非常感谢。我正在尝试将每个组合击键分配为另一种语言,所以我只需要它,只需以简单的方式存储您给我的组合
  • 您先生,是一位该死的天才。如果我学习 js 多年,我不可能做出更好的脚本。它是如此简单,如此美好。
  • @kranzdot 谢谢:)。我也尝试为此创建一个backspace function,但它似乎相当复杂。虽然我得到了backspace 的工作,但在#in 中的选定文本上点击delete 时,似乎不可能区分替换和非替换组合。您可能还需要考虑替换#in 的值...?
【解决方案2】:

这里是:如果按下 q,你有 1 秒钟的时间得到一个 'w' 否则你会得到一个 'x'。这是你想要的吗? (试图让它尽可能容易阅读,最好你会重构一下:)

var openToW = false;

function check(e){
    var text = e.keyCode ? e.keyCode : e.charCode;

    if(text==81){
        openToW=true;
        document.getElementById("out").innerHTML='q';
        setInterval(lock,1000);
    }
    if(text==87){
        if(!openToW){
            document.getElementById("out").innerHTML = 'x';
            return;
        }
        else{
           document.getElementById("out").innerHTML='w';
        }
    }
}

function lock(){
    openToW=false;
}

【讨论】:

  • 您可能希望将seInterval() 替换为setTimeout()。现在,如果多次按下q,浏览器将会崩溃:-(.
  • 感谢 Magnus,如果我有超过 200 个字符要更改,此代码是否合适? @Teemu 在说什么?如果多次按下 q,这个脚本会导致浏览器崩溃吗?
  • @kranzdot Magnus 的代码在每次按下q 时都会开始一个新的间隔循环,这会消耗大量内存......我也怀疑这在涉及setInterval() 时会起作用.
  • @Teemu 检查我对你的回答的回复
猜你喜欢
  • 2016-05-19
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多