Jak mogę uzyskać pozycję karetki z pola wejściowego?
Znalazłem kilka drobiazgów za pośrednictwem Google, ale nie ma kuloodpornego.
Zasadniczo idealna byłaby wtyczka jQuery, więc mogłem po prostu to zrobić
$("#myinput").caretPosition()
javascript
jquery
html
MarkB29
źródło
źródło
<input>
jest łatwiejszy niż w przypadku<textarea>
.size
znaki.Odpowiedzi:
Łatwiejsza aktualizacja:
Użyj
field.selectionStart
przykładu w tej odpowiedzi .Dzięki @commonSenseCode za zwrócenie na to uwagi.
Stara odpowiedź:
Znaleziono to rozwiązanie. Nie oparty na jquery, ale nie ma problemu z integracją go z jquery:
źródło
else if (oField.selectionStart || oField.selectionStart == '0')
może byćelse if (typeof oField.selectionStart==='number')
document.selection
, nie,field.selection
czy coś. Ponadto w IE 7 można było wybrać (nie wiem, czy w 8+ jest to nadal możliwe), aby wybrać coś, a następnie TAB z pola bez utraty wyboru. W ten sposób, gdy tekst jest zaznaczony, ale pole nie jest ostre,document.selection
zwraca zaznaczenie zerowe. Dlatego, aby obejść ten błąd, musisz skoncentrować się na elemencie przed przeczytaniemdocument.selection
.Niezły, wielkie dzięki dla Maxa.
Zawarłem funkcjonalność w jego odpowiedzi w jQuery, jeśli ktoś chce z niej skorzystać.
źródło
input = $(this).get(0)
to samo coinput = this
?this
oznacza pełny pakiet. Jego kod jest jednak nadal błędny, tak powinno byćthis.get(0)
. Jego kod prawdopodobnie nadal działał, ponieważ ponowne zawijanie opakowanego zestawu nic nie robi.BARDZO ŁATWE
Zaktualizowana odpowiedź
Użyj
selectionStart
, jest kompatybilny ze wszystkimi głównymi przeglądarkami .Aktualizacja: Działa tylko wtedy, gdy żaden typ nie jest zdefiniowany lub
type="text"
na wejściu.źródło
.selectionStart
właściwość w dowolnym momencie (document.getElementById('foobar').selectionStart
), nie musi ona znajdować się w detektorze zdarzeń.Masz bardzo proste rozwiązanie . Wypróbuj następujący kod ze zweryfikowanym wynikiem -
Daję ci fiddle_demo
źródło
slice
jest stosunkowo kosztowną operacją i nie dodaje nic do tego „rozwiązania” -el.selectionStart
jest równoważne długości twojego plasterka; po prostu to zwróć. Co więcej, inne rozwiązania są bardziej skomplikowane, ponieważ obsługują inne przeglądarki, które nie obsługująselectionStart
.f1
jest tak samo znaczący jak „user2782001”. 😉Jest teraz ładna wtyczka do tego: The Caret Plugin
Następnie możesz uzyskać pozycję za pomocą
$("#myTextBox").caret()
lub ustawić ją$("#myTextBox").caret(position)
źródło
źródło
Jest tu kilka dobrych odpowiedzi, ale myślę, że możesz uprościć swój kod i pominąć sprawdzanie
inputElement.selectionStart
pomocy: nie jest obsługiwane tylko w IE8 i wcześniejszych wersjach (patrz dokumentacja ), co stanowi mniej niż 1% bieżącego użycia przeglądarki .źródło
Być może potrzebujesz pozycji oprócz pozycji kursora. Oto prosta funkcja, nawet nie potrzebujesz jQuery:
Powiedzmy, że chcesz wywoływać go na wejściu, ilekroć się zmieni lub mysz zmieni pozycję kursora (w tym przypadku używamy jQuery
.on()
). Ze względu na wydajność dobrym pomysłem może być dodaniesetTimeout()
lub podkreślenie,_debounce()
jeśli nadchodzą wydarzenia:Oto skrzypce, jeśli chcesz to wypróbować: https://jsfiddle.net/Dhaupin/91189tq7/
źródło
źródło