Auszug aus Josh Stodolas Einstellung Tastatur-Caret-Position in einer Textbox oder TextArea mit Javascript
Eine generische Funktion, mit der Sie das Caret an einer beliebigen Position eines Textfelds oder Textbereichs einfügen können, die Sie möchten:
function setCaretPosition(elemId, caretPos) {
var elem = document.getElementById(elemId);
if(elem != null) {
if(elem.createTextRange) {
var range = elem.createTextRange();
range.move('character', caretPos);
range.select();
}
else {
if(elem.selectionStart) {
elem.focus();
elem.setSelectionRange(caretPos, caretPos);
}
else
elem.focus();
}
}
}
Der erste erwartete Parameter ist die ID des Elements, in das Sie das Tastatur-Caret einfügen möchten. Wenn das Element nicht gefunden werden kann, passiert (offensichtlich) nichts. Der zweite Parameter ist der Caret-Positon-Index. Zero setzt das Tastatur-Caret am Anfang. Wenn Sie eine Zahl übergeben, die größer als die Anzahl der Zeichen im Elementwert ist, wird das Tastatur-Caret am Ende platziert.
Getestet auf IE6 und höher, Firefox 2, Opera 8, Netscape 9, SeaMonkey und Safari. Leider funktioniert es auf Safari nicht in Kombination mit dem Onfocus-Ereignis.
Ein Beispiel für die Verwendung der obigen Funktion, um das Tastatur-Caret zu zwingen, zum Ende aller Textbereiche auf der Seite zu springen, wenn sie den Fokus erhalten:
function addLoadEvent(func) {
if(typeof window.onload != 'function') {
window.onload = func;
}
else {
if(func) {
var oldLoad = window.onload;
window.onload = function() {
if(oldLoad)
oldLoad();
func();
}
}
}
}
// The setCaretPosition function belongs right here!
function setTextAreasOnFocus() {
/***
* This function will force the keyboard caret to be positioned
* at the end of all textareas when they receive focus.
*/
var textAreas = document.getElementsByTagName('textarea');
for(var i = 0; i < textAreas.length; i++) {
textAreas[i].onfocus = function() {
setCaretPosition(this.id, this.value.length);
}
}
textAreas = null;
}
addLoadEvent(setTextAreasOnFocus);
if(elem.selectionStart)
bricht ab, wenn selectionStart 0 ist, wie auch in der Antwort von jhnns hervorgehoben.elem.value = elem.value.replace(/^9/g,'+79')
im Code. Auf OperaMINI Cursor nach+
. Diese Funktion hilft nichtDer Link in der Antwort ist defekt, dieser sollte funktionieren (alle Credits gehen an blog.vishalon.net ):
http://snipplr.com/view/5144/getset-cursor-in-html-textarea/
Für den Fall, dass der Code erneut verloren geht, sind hier die beiden Hauptfunktionen:
quelle
Da ich diese Lösung wirklich brauchte und die typische Basislösung ( Eingabe fokussieren - dann Wert auf sich selbst setzen ) nicht browserübergreifend funktioniert , habe ich einige Zeit damit verbracht, alles zu optimieren und zu bearbeiten, damit es funktioniert. Aufbauend auf dem Code von @ kd7 habe ich mir Folgendes ausgedacht .
Genießen! Funktioniert in IE6 +, Firefox, Chrome, Safari, Opera
Browserübergreifende Caret-Positionierungstechnik (Beispiel: Bewegen des Cursors auf ENDE)
Das Fleisch und die Kartoffeln sind im Grunde genommen die SetCaretPosition von @ kd7 , wobei die größte Verbesserung darin besteht
if (el.selectionStart || el.selectionStart === 0)
, dass in Firefox der SelectionStart bei 0 beginnt , was in Boolean natürlich zu False wird, also brach er dort.In Chrome war das größte Problem, dass es
.focus()
nicht genug war, es nur zu geben (es wurde immer der gesamte Text ausgewählt!). Daher setzen wir den Wert von sich selbst auf sich selbst,el.value = el.value;
bevor wir unsere Funktion aufrufen, und jetzt hat es einen Griff und eine Position mit dem Eingabe zur Verwendung von selectionStart .quelle
.onclick
anstatt.onfocus
innerhalb Ihrer search_field_focus-Funktionel.value = el.value; [...] if(el !== null)
- Ich würde diese beiden Zeilen tauschen. Wennel
null ist,el.value = el.value
schlägt dies fehl, sodass sich diese Zeile innerhalb von befinden sollteif
.Ich habe die Antwort von kd7 ein wenig angepasst, da elem.selectionStart als false ausgewertet wird, wenn der selectionStart übrigens 0 ist.
quelle
Ich habe einen einfachen Weg gefunden, um dieses in IE und Chrome getestete Problem zu beheben:
Übergeben Sie die Textfeld-ID und die Caret-Position an diese Funktion.
quelle
Wenn Sie ein Textfeld fokussieren müssen und Ihr einziges Problem darin besteht, dass der gesamte Text hervorgehoben wird, während das Caret am Ende stehen soll, können Sie in diesem speziellen Fall diesen Trick verwenden, um den Textfeldwert nach dem Fokus auf sich selbst zu setzen:
quelle
quelle
quelle
tID
sollte die ID des Elements sein, nicht das Elementobjekt selbst. Wenn Sie das Elementobjekt übergeben, können Sie bei dieser Methode einfach die beiden ersten Zeilen entfernen, und es funktioniert.Ich würde die Bedingungen wie folgt beheben:
quelle