Wie kann ich die Caret-Position aus einem Eingabefeld heraus ermitteln?
Ich habe über Google ein paar Kleinigkeiten gefunden, aber nichts kugelsicheres.
Grundsätzlich wäre so etwas wie ein jQuery-Plugin ideal, also könnte ich es einfach tun
$("#myinput").caretPosition()
javascript
jquery
html
MarkB29
quelle
quelle
<input>
ist viel einfacher als in a<textarea>
.size
Zeichen steht.Antworten:
Einfacheres Update:
Verwenden Sie ein
field.selectionStart
Beispiel in dieser Antwort .Vielen Dank an @commonSenseCode für diesen Hinweis.
Alte Antwort:
Diese Lösung gefunden. Nicht jquery-basiert, aber es gibt kein Problem, es in jquery zu integrieren:
quelle
else if (oField.selectionStart || oField.selectionStart == '0')
könnte seinelse if (typeof oField.selectionStart==='number')
document.selection
nichtfield.selection
oder so. Außerdem war es in IE 7 möglich (ich weiß nicht, ob es in 8+ noch möglich ist), etwas auszuwählen und dann TAB aus dem Feld zu entfernen, ohne die Auswahl zu verlieren. Auf diese Weise wird bei Auswahl des Texts, aber nicht fokussiertem Feld diedocument.selection
Nullauswahl zurückgegeben. Um dieses Problem zu umgehen, müssen Sie sich daher auf das Element konzentrieren, bevor Sie das lesendocument.selection
.Schön, vielen Dank an Max.
Ich habe die Funktionalität in seiner Antwort in jQuery verpackt, wenn jemand sie verwenden möchte.
quelle
input = $(this).get(0)
dasselbe wieinput = this
?this
bezieht sich auf ein vollständig verpacktes Set. Sein Code ist immer noch falsch, es sollte einfach so seinthis.get(0)
. Sein Code funktionierte wahrscheinlich immer noch, weil das erneute Umwickeln eines verpackten Sets nichts bewirkt.SEHR LEICHT
Antwort aktualisiert
Verwenden Sie es
selectionStart
, es ist kompatibel mit allen gängigen Browsern .Update: Dies funktioniert nur, wenn kein Typ definiert ist oder
type="text"
für die Eingabe.quelle
.selectionStart
Eigenschaft jederzeit überprüfen (document.getElementById('foobar').selectionStart
), sie muss sich nicht in einem Ereignis-Listener befinden.Habe eine sehr einfache Lösung . Versuchen Sie den folgenden Code mit verifiziertem Ergebnis -
Ich gebe dir das fiddle_demo
quelle
slice
ist eine relativ teure Operation und fügt dieser "Lösung" nichts hinzu -el.selectionStart
entspricht der Länge Ihres Slice; gib das einfach zurück. Darüber hinaus sind die anderen Lösungen komplizierter, weil sie sich mit anderen Browsern befassen, die dies nicht unterstützenselectionStart
.f1
ist ungefähr so aussagekräftig wie 'user2782001'. 😉Dafür gibt es jetzt ein schönes Plugin: Das Caret Plugin
Dann können Sie die Position mit abrufen
$("#myTextBox").caret()
oder über einstellen$("#myTextBox").caret(position)
quelle
quelle
Hier gibt es einige gute Antworten, aber ich denke, Sie können Ihren Code vereinfachen und die Überprüfung auf
inputElement.selectionStart
Unterstützung überspringen : Er wird nicht nur in IE8 und früheren Versionen (siehe Dokumentation ) unterstützt, was weniger als 1% der aktuellen Browsernutzung entspricht .quelle
Möglicherweise benötigen Sie zusätzlich zur Cursorposition einen ausgewählten Bereich. Hier ist eine einfache Funktion, Sie brauchen nicht einmal jQuery:
Angenommen, Sie möchten es bei einer Eingabe aufrufen, wenn sich die Cursorposition ändert oder die Maus bewegt (in diesem Fall verwenden wir jQuery
.on()
). Aus Leistungsgründen kann es eine gute Idee sein,setTimeout()
Unterstriche hinzuzufügen oder etwas Ähnliches,_debounce()
wenn Ereignisse eintreten:Hier ist eine Geige, wenn Sie sie ausprobieren möchten: https://jsfiddle.net/Dhaupin/91189tq7/
quelle
quelle