Próbuję wyodrębnić dokładny wybór i położenie kursora z obszaru tekstowego. Jak zwykle, to, co jest łatwe w większości przeglądarek, nie jest w IE.IE's document.selection.createRange nie zawiera początkowych lub końcowych pustych wierszy.
używam to:
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;
Który działa 99% czasu. Problem polega na tym, że TextRange.text
nie zwraca początkowych ani końcowych znaków nowego wiersza. Tak więc, gdy kursor jest parą pustych linii po akapicie, uzyskuje pozycję na końcu poprzedzającego akapitu - zamiast rzeczywistej pozycji kursora.
np
the quick brown fox| <- above code thinks the cursor is here
| <- when really it's here
Jedyna poprawka mogę myśleć jest tymczasowo wstawić znak przed i po selekcji, chwyć rzeczywisty wybór, a następnie ponownie usunąć te znaki tymczasowe. To hack, ale w szybkim eksperymencie wygląda na to, że zadziała.
Ale najpierw chciałbym być pewien, że nie jest łatwiejszy sposób.
Nice. Podobnie jak pomysł użycia długości tekstu zamiast naprawdę dużej liczby na moveStart/moveEnd. –
Ah, nie widziałem tego. Wynik to 20-30ms, świetna robota! –
@Andy: Napisałem wtyczkę jQuery, która zawiera to. Jeszcze nieudokumentowane i połączone ze słabo powiązanym projektem, ale działające: http://code.google.com/p/rangy/downloads/detail?name=textinputs_jquery-src.js –