0

복잡한 WYSIWYG를 빌드하려고하는데 일부 키를 누른 후에 일부 동작을 만들고 싶습니다.키 업과 keydown이 동기화되지 않았습니까?

이렇게하려면 div에 이라는 jquery keypresskeyup 수신기를 추가합니다. 내 행동 중 하나가 HTML을 약간 변경하고이 변경 후 커서 위치가 그대로 유지됩니다.

keyup 이벤트를 처리 할 때 keyupkeydown 사이에는 아무런 관련이 없습니다.

keyup 이벤트는 시간 관계로해서는 안됩니다.

예를 작성하기 시작하면 keydownkeyup 사이에 순서가 없음을 알 수 있습니다. 키 키 B 대한 'keyup` 후에 가압 한 경우

B의 이벤트 후 소성한다.

var result = document.getElementById('div-result'); 
 
function log(msg) { 
 
    result.innerHTML = result.innerHTML + '<br>' + msg; 
 
} 
 
$('#div-editable').keydown(function(e) { 
 
    log('down:&nbsp;' + e.keyCode); 
 
}); 
 
$('#div-editable').keyup(function(e) { 
 
    log('up:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + e.keyCode); 
 
}); 
 
log('Iniciando log...');
div#div-editable { 
 
    background: #F2F2F2; 
 
    padding: 10px; 
 
    border: solid 1px #333333; 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script> 
 
<div id="div-editable" contenteditable>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor 
 
    in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</div> 
 

 
<div id="div-result"></div>

이러한 방법을 동기화하는 방법은 없습니다. 즉, 내가 처리 할 때 keyup, keydown을 기다려야합니다.

+2

문제가 무엇인지 알 수 없습니다. –

+0

키를 위아래로 사용하여 해결하려는 문제는 무엇입니까? – epascarello

+0

나는 모든 쓴 텍스트를 단어들로 나누어야한다. 'word1 word2 word3'과 같은 단어가 ' word1 word2 word3'이됩니다. – Victor

답변

3

keyupkeydown은 문자 그대로입니다. , 길게는 b을 누른 다음 을 놓으십시오.

keydown : a, keydown : b :, keyup : b, keyup : a.

이러한 이벤트는 의 'out of order'로 처리 할 수 ​​있어야합니다..

+0

확인. 내가 어떻게 대처할 수 있니? 이것은 질문입니다! 동기화를 만들 수있는 방법은 없습니다. – Victor

+1

커서 위치를 추적한다는 의미입니까? 'onkeyup/down' 이벤트가 실행되는 동안 커서 위치를 알아야합니까? 선택/범위 API를 사용하여 항상 커서 위치를 가져올 수 있습니다. https://developer.mozilla.org/en/docs/Web/API/Range – Halcyon

+0

나는 내 질문에 항의하지 않을 것이라고 생각합니다. 나는 범위와 선택을 알아. 나는 그 사건을 동기화하는 방법이 있다는 것을 알고 싶다! – Victor

0

아마도 어떤 키가 눌려지고 있는지에 대한 상태 정보를 유지하기를 원할 때까지 어떤 중복 이벤트도 무시할 수 있습니다. 예 :

var result = document.getElementById('div-result'); 
var pressed_keys = {}; 

function log(msg) { 
    result.innerHTML = result.innerHTML + '<br>' + msg; 
} 

$('#div-editable').keydown(function(e) { 
    if (pressed_keys[e.keyCode]) { 
     // Currently pressed, ignore. 
     return; 
    } 

    // Mark key as pressed. 
    pressed_keys[e.keyCode] = true; 

    log('down:&nbsp;' + e.keyCode); 
}); 

$('#div-editable').keyup(function(e) { 
    log('up:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + e.keyCode); 

    // Mark key has depressed. 
    pressed_keys[e.keyCode] = false; 
}); 

log('Iniciando log...');