2011-09-28 3 views
3

나는 텍스트 영역에 위젯을 개정 라이브러리를 쓰고 있어요, 그래서 사용자가 입력 뭔가를 시작할 때 감지해야합니다를 keyDown에) (.val 받기 *하지 *의 keyup

this.$input.bind('keydown keyup', function() { 
    if (this.$input.val() == …) { … } 
} 

.val()keyup이 트리거 될 때만 업데이트됩니다. 그것은 너무 지연됩니다. 입력 상자의 상태를 keydown에 알려주세요. .val()을 향상시키는 라이브러리에 대해 알고 있습니까?

답변

3

Found a seemingly perfect solution. 앞에서 설명한 HTML5 oninputonpropertychange을 IE 용으로 사용합니다. 훌륭한. 환상적. 다른 행복한 단어들.

5

너무 늦습니까? 10ms가 그렇게 많은 차이를 만들어내는 시나리오를 상상할 수는 없지만 항상 이벤트 인수를 검사하고 거기에서 숯을 얻을 수 있습니다. 또는 keypress을 시도하십시오.

편집 :input event 또한 입력이 변경되면 (키 업 이전이지만 값이 변경된 후에) 실행됩니다.

+0

입력 상자의 텍스트가 키보드 입력에 즉시 반응하므로 내 위젯의 지연된 응답이 실제로 나타납니다. –

+0

@MatthewRobertson : 업데이트를 참조하십시오. – mpen

+2

와우, 완벽 해 보인다. 너는 모든 것을 얻는다. –

3

keydown/keypress의 문자를 판별 할 수있는 유일한 방법은 (이벤트 리스너 함수의 첫 번째 인수로서 건네 event 개체이다)을 event.keyCodeevent.which 또는 속성을 사용하는 것이다.

이벤트를 keypress 이벤트로 바꿉니다. 이 이벤트 리스너는 키를 누른 상태에서 시작됩니다. keydownkeyup은 한 번만 해고됩니다. keydown/keyup 이벤트 동안 여러 문자를 추가 할 수있었습니다.

1

키 누르기 (예 : "a"키)의 경우 "a"가 텍스트 입력에 추가되기 전에 keydown 이벤트가 트리거됩니다. 이벤트 유형을 감지하고 .keyCode (또는 .which) 이벤트 속성이 인쇄 가능한 범위의 키인지 여부를 확인하고 keyup 이벤트 이후에 반환 할 수있는 내용이 무엇이겠습니까? 이것은 잘못된 아이디어입니다.

this.$input.bind('keydown keyup', function(e) { 
    var val = this.$input.val(); 

    if (e.type == 'keydown') { 
     // Here is where you would check to see if e.keyCode was a printable 
     // character. Note that key codes differ from ASCII codes. For 
     // example, the "a" key will return key code 65, which is actually 
     // the ASCII code for "A", so you would need to check for the presence 
     // of shift keys and such. Again, this is a bad idea :) 
     val += String.fromCharCode(e.keyCode); 
    } 

    if (val == …) { … } 
} 
+1

왜 나쁜 생각입니까? –

+2

@Matthew : 둥근 구멍에 사각형의 못을 밀어 넣기 때문입니다. 'keydown' 이벤트는 정의상 keypress의 다른 이벤트보다 먼저 발생합니다. 즉, 키 - 텍스트 번역을 제어하는 ​​것이 아직 실행할 기회를 갖지 못했음을 의미합니다. 그래서 그것은 기본적으로 훨씬 덜 직관적이고 포괄적 인 방법으로 그 번역 논리를 다시 구현할 것입니다. 즉, 당신은 열등한 바퀴를 재발 명하게 될 것입니다. – FtDRbwLXw6