2013-05-09 2 views
2

나는 내가 q을 누르면, 그것은 q 분명히 w, 하지만를 표시해야합니다 q 다음 일초 후 나는 w를 누르면 키를 누르면, 다시 전화에 표시하는 작은 스크립트를 구축을 위해 노력하고 w하지에 있어요 같은 시간, 그냥 1 초 미만, 그것은 다른 문자를 보여 주야합니다 예 : 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> 

나는 자바 스크립트에 새로운 오전, 나는 당신이 다음도 초 안에 존재하는 또 다른 하나가 있다면 듣고 기다려야 하나 개의 키 입력을 기록 할 수 있습니다 무엇으로 손실입니다. 나는 또한 시도했다, setInterval() 함수,하지만 주어진 시간의 양으로 함수를 실행합니다.

+0

[fiddle] (http://jsfiddle.net/aswgM/1/)이 필요한가요? – Teemu

+0

예, 아니요. @Temu는 1 초 안에'q'와'w'를 누르면'x' 대신'qx'가 표시되기 때문입니다. 그걸 확인해 줄 수 있니? –

답변

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에서 라이브 데모. 이 코드는 onkeypress위한 것으로,

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; 
} 

주의 사항 :


편집 당신은 코멘트를 통해 좀 더 많은 요구 사항을 추가 한 이후

, 여기에 작업에 대한 편집 코드입니다 행사. 키 코드에서 문자를 만들 때 더욱 안정적입니다. 백 스페이스과 같은 특별한 키에 대해 별도의 이벤트 처리를 할당 할 수 있습니다. 처리기 기능은 onkeyup입니다.

이 코드는 완벽한 코드는 아니지만이 태스크를 구현하는 방법에 대한 아이디어를 제공합니다. 객체 리터럴을 사용하여 모든 키 조합과 그 대체물을 저장합니다. 이렇게하면 루프를 전혀 작성할 필요가 없습니다.

jsFiddle에 실례가 있습니다.

+0

이것은 가장 좋은 답변입니다 ...하나의 질문은 200 문자 이상을 바꾸려고하는 것입니다.'qw'가'x'를 보여 주듯이 다른 문자를 반향시킬'qw'와 같은 것이 200 개 이상 있기 때문에 제 질문은 어쨌든' { text = 'x'; 200 times –

+0

@kranzdot이 코드는 매우 특별한 경우에만 사용됩니다 (이 새로운 날짜() - 타이머 <1000 && text === 'w'&& previousChar === 'q' 그 질문에 너처럼. 확인해야 할 키 조합이 여러 개인 경우 루프를 확인해야합니다. 당신은 조합이나 sth의 배열을 만들 수 있습니다 ... 나는 이것과 함께 플레이 해보고, 내가 뭘 할 수 있는지 봅니다. – Teemu

+0

sooo 고맙습니다. 모든 결합 된 키 입력을 다른 언어로 지정하려고합니다. 그래서 당신이 나에게 준 조합을 저장하는 데 필요한 모든 것이 간단한 방법으로 이루어집니다. –

1

여기에 간다 : q를 눌렀을 때 'w'를 얻는 데 1 초가 있으면 '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; 
} 
+0

'seInterval()'을'setTimeout()'으로 바꿀 수도 있습니다. 이제'q'가 여러 번 눌려지면 브라우저가 다운됩니다. – Teemu

+0

Magnus에게 감사드립니다. 변경하고 싶은 200 자 이상인 경우이 코드가 적합할까요? 그리고 @Teemu가 말하는 것은 무엇입니까?이 스크립트는 브라우저가 q를 여러 번 누를 경우 –

+0

@kranzdot 매그너스 코드는'q '를 누를 때마다 새로운 간격 루프를 시작합니다. 많은 메모리를 소비합니다 ... 또한'setInterval() '관련되어 있습니다. – Teemu