Sto provando ad estrarre la selezione esatta e la posizione del cursore da un'area di testo. Come al solito, ciò che è facile nella maggior parte dei browser non è in IE.IE document.selection.createRange non include righe vuote iniziali o finali
Sto usando questo:
var sel=document.selection.createRange();
var temp=sel.duplicate();
temp.moveToElementText(textarea);
temp.setEndPoint("EndToEnd", sel);
selectionEnd = temp.text.length;
selectionStart = selectionEnd - sel.text.length;
Quali opere il 99% del tempo. Il problema è che TextRange.text
non restituisce caratteri iniziali o finali di nuove righe. Quindi, quando il cursore è un paio di righe vuote dopo un paragrafo, restituisce una posizione alla fine del paragrafo precedente, piuttosto che la posizione attuale del cursore.
esempio:
the quick brown fox| <- above code thinks the cursor is here
| <- when really it's here
L'unica soluzione mi viene in mente è quello di inserire temporaneamente un carattere prima e dopo la selezione, afferrare la selezione vera e propria e quindi rimuovere di nuovo quei personaggi di temp. È un hack ma in un rapido esperimento sembra che funzionerà.
Ma prima vorrei essere sicuro che non ci sia un modo più semplice.
Bello. Ti piace l'idea di usare la lunghezza del testo invece del numero veramente grande sul moveStart/moveEnd. –
Ah, non l'ho visto. Il risultato è 20-30ms ora, lavoro eccellente! –
@Andy: ho scritto un plug-in jQuery che include questo. Non ancora documentato e integrato in un progetto tenuamente correlato, ma funzionante: http://code.google.com/p/rangy/downloads/detail?name=textinputs_jquery-src.js –