Ho una serie di div multilinea contenteditable disposti verticalmente, e voglio consentire la naturale navigazione tra di loro da tasti freccia (come se fosse un documento). Per questo, il keydown
evento devo:Rendere più contenteditables si comportano come un documento
- Conoscere riga corrente del cursore e numero di righe per determinare se è necessario salire (prima riga e premuto ↑ chiave) o giù (ultima riga e ↓ chiave)
- sapere corrente carattere (posizione in una stringa illustrato) per determinare se è necessario salire (posizione == 0 e premere il tasto ← ed) o giù (posizione == text.length e → premuto)
- Il processo non dovrebbe arrestarsi tra gli elementi di commutazione quando la chiave si svolge e non rilasciato (quindi
keydown
evento, nonkeyup
) - Preferibilmente : L'evento dovrebbe smettere di propagare (ad esempio, se sono sulla prima colonna nell'ultima riga e preme la chiave ↓, non dovrebbe saltare all'ultimo carattere sulla linea e quindi scendere)
- Preferibilmente (sarebbe davvero fantastico): dopo aver saltato al prossimo elemento, non avremmo solo l'elemento
.focus()
, ma emuleremo un clic nella stessa posizione verticale come quando eravamo prima, in modo che sembrasse naturale, come negli editor di testo.
Tutti gli script/librerie che ho trovato fino ad oggi non stanno facendo tutto ciò di cui ho bisogno o sono bug. Per favore includi dei demo nei tuoi suggerimenti, in modo che io possa testare senza incorporare prima il mio codice. Grazie!
Aggiornamento: visivo spiegazione - di notare che ci sono più di 2 div e 'tasto freccia giù sull'ultima riga' è solo uno dei quattro trigger
Cosa vuoi ottenere esattamente?Qualcosa che assomiglia a Excel? Quando fai clic su un testo di seguito, dove vuoi inserire il cursore? Alla fine della fila? Dove hai cliccato? Come vengono caricati i contenuti contentedabili nel DOM? Lo carichi con JS o direttamente in HTML? Hai colonne o solo righe? –
@ R.Foubert, no, non Excel, ma come editor di blocco note o WYSIWYG. Non ci sono colonne, solo paragrafi con righe/linee, e i paragrafi devono essere blocchi div separati. Questi blocchi vengono caricati da AJAX e salvati da AJAX. Quando fai clic sul testo, il punto di inserimento dovrebbe essere al pixel cliccato, proprio come qualsiasi editor. –
e solo un'altra domanda. Perché hai bisogno di contenteditable? Ad esempio, potresti usare textarea, quindi perché hai scelto contenteditable? –