Sto scrivendo un evidenziatore di sintassi. L'evidenziatore dovrebbe aggiornare immediatamente l'evidenziatura durante l'immissione del testo e la navigazione con i tasti freccia.Come ottenere la posizione del cursore del testo dopo l'evento della pressione di un tasto?
Il problema che sto affrontando è che quando viene attivato l'evento "keypress", si ottiene comunque la vecchia posizione del cursore di testo tramite window.getSelection()
.
Esempio:
function handleKeyEvent(evt) {
console.log(evt.type, window.getSelection().getRangeAt(0).startOffset);
}
var div = document.querySelector("div");
div.addEventListener("keydown", handleKeyEvent);
div.addEventListener("keypress", handleKeyEvent);
div.addEventListener("input", handleKeyEvent);
div.addEventListener("keyup", handleKeyEvent);
<div contenteditable="true">f<span class="highlight">oo</span></div>
Nell'esempio, posizionare il cursore prima della parola 'foo', quindi premere → (il tasto freccia destra).
all'interno della console del vostro DevTool preferito vedrete il seguente:
keydown 0
keypress 0
keyup 1
Che 0
oltre keypress
è ovviamente la vecchia posizione del cursore. Se si tiene premuto → un po 'più a lungo, si otterrà qualcosa di simile:
keydown 0
keypress 0
keydown 1
keypress 1
keydown 1
keypress 1
keydown 2
keypress 2
keyup 2
Quello che voglio ottenere è la nuova posizione del cursore come vorrei farlo per 'KeyUp' o 'input'. Anche se "keyup" viene attivato troppo tardi (voglio evidenziare la sintassi mentre il tasto è premuto) e "input" viene attivato solo quando c'è effettivamente un input (ma → non produce alcun input).
C'è un evento che viene attivato dopo che la posizione del cursore è cambiata e non solo in ingresso? O devo calcolare la posizione del cursore del testo e, in caso affermativo, come? (Suppongo questo può diventare piuttosto complicato quando il testo avvolge e si preme ↓ (il tasto freccia giù).)
Penso che avremo un altro problema usando l'evento keypress. Chrome non sembra attivare l'evento quando si preme un tasto freccia (Firefox lo fa). C'è un vecchio bug chromium nello stato WontFix che descrive questo: https://bugs.chromium.org/p/chromium/issues/detail?id=2606 – Alex
Grazie per il suggerimento! A destra, l'evento 'keypress' non viene attivato, ma [è ovviamente contrassegnato come obsoleto] (https://www.w3.org/TR/uievents/#legacy-keyboardevent-event-types), comunque. Come ho visto ora, la specifica afferma che si consiglia alle persone di utilizzare invece l'evento 'beforeinput'. Anche il 'keydown' viene sparato continuamente. Anche se tutti quegli eventi sono stati sparati troppo presto. Ho ora [archiviato un problema sulla specifica degli eventi UI] (https://github.com/w3c/uievents/issues/111) nella speranza di ottenere un evento adeguato per questo. –
Le posizioni del cursore/selezione ecc. Sono ancora una pita da supportare su tutti i browser. È stato un po 'che avevo bisogno di questo, ma [rangy] (https://github.com/timdown/rangy) è molto solido con le cose relative al cursore .. –