2

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

<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()函数,但它仅按给定的时间量执行函数。

4

2 回答 2

1

这里是这样的:如果 q 被按下,你有一秒钟的时间得到一个'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;
}
于 2013-05-09T13:17:38.833 回答
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的现场演示。


编辑

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

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事件。从键码创建字符时更可靠。backspace您可以在onkeyup处理函数中为特殊键(如 )分配单独的事件处理。

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

jsFiddle的一个活生生的例子。

于 2013-05-09T13:53:43.977 回答