Verwenden Sie JavaScript, um den Cursor am Ende des Texts im Texteingabeelement zu platzieren


308

Was ist der beste Weg (und ich nehme den einfachsten Weg an), den Cursor am Ende des Textes in einem Eingabetextelement über JavaScript zu platzieren - nachdem der Fokus auf das Element gesetzt wurde?

Antworten:


170

Ich hatte das gleiche Problem (nachdem ich den Fokus über RJS / Prototyp gesetzt hatte) im IE. Firefox hat den Cursor bereits am Ende verlassen, wenn bereits ein Wert für das Feld vorhanden ist. IE zwang den Cursor an den Anfang des Textes.

Die Lösung, zu der ich gekommen bin, lautet wie folgt:

<input id="search" type="text" value="mycurrtext" size="30" 
       onfocus="this.value = this.value;" name="search"/>

Dies funktioniert sowohl in IE7 als auch in FF3


3
Was wird es für Textarea sein?
Tareq

19
Funktioniert jetzt in Chrome (9.0.597.98)
Matt

6
Dies funktioniert jetzt in IE9 nicht mehr - der Cursor springt zum Feldanfang .
Stadt

6
Funktioniert auch nicht in FF 8. Die Lösung von Chenosaurus scheint jedoch zu funktionieren.
Simon

3
arbeitete für mich in Chrome 24.0.1312.57, IE 9.0.8112, aber nicht in Firefox 18.0.2
Chris - Haddox Technologies

190

Es gibt eine einfache Möglichkeit, es in den meisten Browsern zum Laufen zu bringen.

this.selectionStart = this.selectionEnd = this.value.length;

Aufgrund der * Macken einiger Browser sieht eine umfassendere Antwort jedoch eher so aus

setTimeout(function(){ that.selectionStart = that.selectionEnd = 10000; }, 0);

Verwenden von jQuery (um den Listener festzulegen, aber sonst ist es nicht erforderlich)

Verwenden von Vanilla JS (Ausleihfunktion addEventaus dieser Antwort )


Macken

Chrome hat eine merkwürdige Eigenart, bei der das Fokusereignis ausgelöst wird, bevor der Cursor in das Feld bewegt wird. was meine einfache Lösung vermasselt. Zwei Optionen, um dies zu beheben:

  1. Sie können eine Zeitüberschreitung von 0 ms hinzufügen ( um den Vorgang zu verschieben, bis der Stapel frei ist ).
  2. Sie können das Ereignis von focusbis ändern mouseup. Dies wäre für den Benutzer ziemlich ärgerlich, wenn Sie nicht den Fokus behalten würden. Ich bin nicht wirklich in eine dieser Optionen verliebt.

Außerdem wies @vladkras darauf hin, dass einige ältere Versionen von Opera die Länge falsch berechnen, wenn Leerzeichen vorhanden sind. Hierfür können Sie eine große Zahl verwenden, die größer als Ihre Zeichenfolge sein sollte.


2
arbeitete für mich in Chrome 24.0.1312.57, IE 9.0.8112 und Firefox 18.0.2
Chris - Haddox Technologies

4
Dies ist eine gute Lösung anstelle einer Beobachtung (kludge), ist weniger Code und verständlicher als die hier diskutierten Alternativen. Vielen Dank.
Derek Litz

Ich würde das lieber nur für das erste Fokusereignis tun und es sofort aufrufen. Andernfalls wird der Cursor jedes Mal, wenn Sie in das Feld klicken, an das Ende bewegt.
Damien

this.selectionStart = this.selectionEnd = 0; Dadurch sollte der Fokus vor dem ersten Buchstaben des Eingabefelds verschoben werden. Vielmehr ändert sich beim Debuggen nicht einmal der Wert von selectionEnd und selectionStart! Und auch nicht auf den ersten Charakter verschieben !!
Soham

1
Es wurde berichtet, dass Opera manchmal falsch funktioniert selectionStartund eine lengthkleinere Anzahl von Leerzeichen zurückgibt . Deshalb benutze ich 10000oder eine andere ausreichend große Zahl anstelle von this.value.length(getestet auf IE8 und IE11)
vladkras

160

Versuchen Sie dies, es hat bei mir funktioniert:

//input is the input element

input.focus(); //sets focus to element
var val = this.input.value; //store the value of the element
this.input.value = ''; //clear the value of the element
this.input.value = val; //set that value back.  

Damit sich der Cursor zum Ende bewegt, muss die Eingabe zuerst fokussiert sein. Wenn der Wert geändert wird, wird das Ende erreicht. Wenn Sie .value auf den gleichen Wert einstellen, ändert sich dies in Chrome nicht.


2
Dies ist wie onfocus = "this.value = this.value;
Tareq

15
Das Festlegen des Fokus vor dem Festlegen des Werts ist der Schlüssel, damit er in Chrome funktioniert.
Anatoly Techtonik

7
Warum this.in den Zeilen 2, 3 und 4 vor den Eingang stellen? Wir wissen bereits, dass dies inputdas Eingabeelement ist. Die Verwendung thisscheint überflüssig. Ansonsten gute Lösung!
The111

3
@ Tareq Sie sind nicht gleich. Dieser Trick ist viel besser als die akzeptierte Antwort.
Lewis

4
Einfacher:$input.focus().val($input.val());
Milkovsky

99

Nachdem ich ein bisschen damit herumgehackt hatte, fand ich, dass der beste Weg war, die setSelectionRangeFunktion zu verwenden, wenn der Browser sie unterstützt. Wenn nicht, verwenden Sie wieder die Methode in Mike Berrows Antwort (dh ersetzen Sie den Wert durch sich selbst).

Ich stelle auch scrollTopeinen hohen Wert ein, falls wir vertikal scrollbar sind textarea. (Die Verwendung eines willkürlich hohen Werts scheint zuverlässiger zu sein als $(this).height()in Firefox und Chrome.)

Ich habe es als jQuery-Plugin gemacht. (Wenn Sie jQuery nicht verwenden, können Sie das Wesentliche trotzdem leicht genug verstehen.)

Ich habe in IE6, IE7, IE8, Firefox 3.5.5, Google Chrome 3.0, Safari 4.0.4 und Opera 10.00 getestet.

Es ist auf jquery.com als PutCursorAtEnd-Plugin verfügbar . Der Code für Release 1.0 lautet wie folgt:

// jQuery plugin: PutCursorAtEnd 1.0
// http://plugins.jquery.com/project/PutCursorAtEnd
// by teedyay
//
// Puts the cursor at the end of a textbox/ textarea

// codesnippet: 691e18b1-f4f9-41b4-8fe8-bc8ee51b48d4
(function($)
{
    jQuery.fn.putCursorAtEnd = function()
    {
    return this.each(function()
    {
        $(this).focus()

        // If this function exists...
        if (this.setSelectionRange)
        {
        // ... then use it
        // (Doesn't work in IE)

        // Double the length because Opera is inconsistent about whether a carriage return is one character or two. Sigh.
        var len = $(this).val().length * 2;
        this.setSelectionRange(len, len);
        }
        else
        {
        // ... otherwise replace the contents with itself
        // (Doesn't work in Google Chrome)
        $(this).val($(this).val());
        }

        // Scroll to the bottom, in case we're in a tall textarea
        // (Necessary for Firefox and Google Chrome)
        this.scrollTop = 999999;
    });
    };
})(jQuery);

4
Warum die Länge berechnen? Warum nicht einfach this.setSelectionRange (9999,9999), wenn Sie es trotzdem überschreiten wollen?
PRMan

21
<script type="text/javascript">  
    function SetEnd(txt) {  
      if (txt.createTextRange) {  
       //IE  
       var FieldRange = txt.createTextRange();  
       FieldRange.moveStart('character', txt.value.length);  
       FieldRange.collapse();  
       FieldRange.select();  
       }  
      else {  
       //Firefox and Opera  
       txt.focus();  
       var length = txt.value.length;  
       txt.setSelectionRange(length, length);  
      }  
    }   
</script>  

Diese Funktion funktioniert für mich in IE9, Firefox 6.x und Opera 11.x.


Tolle, erste fertige Lösung, die sowohl für FF6 als auch für IE8 zu funktionieren scheint.
Simon

3
Aus irgendeinem Grund hat die beliebte Antwort bei mir nicht funktioniert. Das hat perfekt funktioniert.
Metrik152

Funktioniert bei mir in IE9 nicht. Fehler:SCRIPT16389: Unspecified error.
Soham

1
Funktioniert perfekt in FF 46, Chrome 51 und IE 11.
Webdevguy

Dies funktioniert in IE 8, während eine andere Option dies nicht tat. Danke dir.
BenMaddox

17

Ich habe folgendes mit ziemlich großem Erfolg in Chrom versucht

$("input.focus").focus(function () {
    var val = this.value,
        $this = $(this);
    $this.val("");

    setTimeout(function () {
        $this.val(val);
    }, 1);
});

Kurzer Überblick:

Es nimmt jedes Eingabefeld mit dem Klassenfokus darauf, speichert dann den alten Wert des Eingabefelds in einer Variablen und wendet anschließend die leere Zeichenfolge auf das Eingabefeld an.

Dann wartet es 1 Millisekunde und gibt den alten Wert wieder ein.


perfekt! Alle anderen Lösungen funktionieren nicht für mich, nur Ihre Lösung funktioniert für mich. Vielleicht, weil ich PHP verwende, um dem Textbereich einen Wert zuzuweisen, und js den Wert nicht erkennen kann, so dass js 1 Millisekunde warten muss.
zac1987

3
@ zac1987 das ist wahrscheinlich nicht der fall, da php das html rendern würde, das html auf den client geladen würde und dann das js laufen würde. Möglicherweise warten Sie nicht auf ein dokumentenfertiges Ereignis.
Reconbot

Nur um darauf hinzuweisen, dass die Verwendung von setTimeout eine solche Ursache für unvorhersehbare Ergebnisse sein kann. Der Code kann sich unter bestimmten Umständen korrekt verhalten, da sich manchmal die Eingabe während dieser 1 ms ändert und der Wert nicht zurückgesetzt wird. Es ist auch wichtig zu beachten, dass 1 ms Sekunde die minimale Wartezeit ist. Wenn Sie also einige CPU-gebundene Methoden haben, kann der Fokus länger als 1 ms warten. Dadurch reagiert die Benutzeroberfläche nicht mehr. Und es sollte nicht notwendig sein, da die .val () -Methode ohnehin Änderungen an der Benutzeroberfläche auslösen sollte.
Loïc Faure-Lacroix

10

Es ist 2019 und keine der oben genannten Methoden hat bei mir funktioniert, aber diese hat von https://css-tricks.com/snippets/javascript/move-cursor-to-end-of-input/ übernommen.

function moveCursorToEnd(id) {
  var el = document.getElementById(id) 
  el.focus()
  if (typeof el.selectionStart == "number") {
      el.selectionStart = el.selectionEnd = el.value.length;
  } else if (typeof el.createTextRange != "undefined") {           
      var range = el.createTextRange();
      range.collapse(false);
      range.select();
  }
}
<input id="myinput" type="text" />
<a href="#" onclick="moveCursorToEnd('myinput')">Move cursor to end</a>


1
Danke @MaxAlexanderHanna, ich hatte nur el.focus()in der, else ifso dass es in einigen Fällen nicht funktionierte. Ich habe überprüft, dass dies jetzt in Chrom und (Schauder) IE funktioniert
Andy Raddatz

getestet und funktioniert sowohl im IE als auch in CHROME ab dem 12.07.2019. Danke, positiv bewertet.
Max Alexander Hanna

Fantastisch, dies funktioniert in Safari auf der Catalina Beta.
NetOperator Wibby

8

Einfach. Stellen Sie beim Bearbeiten oder Ändern von Werten zuerst den Fokus und dann den Wert ein.

$("#catg_name").focus();
$("#catg_name").val(catg_name);

Der alte Standard funktioniert hier 2016 noch in Chrome und FF.
Volomike

1
Perfekte Antwort.
Partha Paul

7

Trotzdem wird die Zwischenvariable benötigt (siehe var val =), sonst verhält sich der Cursor seltsam, wir brauchen sie am Ende.

<body onload="document.getElementById('userinput').focus();">
<form>
<input id="userinput" onfocus="var val=this.value; this.value=''; this.value= val;"
         class=large type="text" size="10" maxlength="50" value="beans" name="myinput">
</form>
</body>

6

el.setSelectionRange(-1, -1);

https://codesandbox.io/s/peaceful-bash-x2mti

Diese Methode aktualisiert die Eigenschaften HTMLInputElement.selectionStart, selectionEnd und selectionDirection in einem Aufruf.

https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange

In anderen js-Methoden -1bedeutet normalerweise (bis zum) letzten Zeichen. Dies ist auch bei diesem Fall der Fall, aber ich konnte dieses Verhalten in den Dokumenten nicht explizit erwähnen.


Das funktioniert perfekt für mich und es ist am einfachsten. +1
Chris Farr

Ich musste auch onfocus = "this.value = this.value;" von Mike Berrows Antwort
Chris Farr

5

Für alle Browser für alle Fälle:

function moveCursorToEnd(el) {
    window.setTimeout(function () {
            if (typeof el.selectionStart == "number") {
            el.selectionStart = el.selectionEnd = el.value.length;
        } else if (typeof el.createTextRange != "undefined") {
            var range = el.createTextRange();
            range.collapse(false);
            range.select();
        }
    }, 1);
}

Zeitüberschreitung erforderlich, wenn Sie den Cursor vom onFocus-Ereignishandler bewegen müssen


Beachten Sie jedoch, dass dies unter Android zu Problemen führt, da durch die Bereichsauswahl Daten in den Tastaturpuffer gestellt werden. Dies bedeutet, dass jede von Ihnen eingegebene Taste den Text in der Eingabe dupliziert, was nicht besonders nützlich ist.
Mike 'Pomax' Kamermans

1
Das ist großartig und hat für mich großartig funktioniert, dh! Ich habe eine Reihe von Eingaben, die eine scrollLeft benötigen und die seltsame Dinge tun, dh ich suchte nach etwas, das ich für eine Unterlegscheibe verwenden könnte, und das war es. Es funktioniert nicht in anderen Browsern, aber wenn nichts funktioniert, ist das erstaunlich!
Zazvorniki

5

Ich mag die akzeptierte Antwort sehr, aber sie funktioniert in Chrome nicht mehr. In Chrome muss sich der Eingabewert ändern, damit der Cursor das Ende erreicht. Die Lösung lautet wie folgt:

<input id="search" type="text" value="mycurrtext" size="30" 
   onfocus="var value = this.value; this.value = null; this.value = value;" name="search"/>

1
Dies ist die Lösung, die jetzt für mich in Chrome funktioniert. Die Syntax ist seltsam, aber hey, ich werde erst einmal lernen, mit dieser Lösung zu leben!
Sam Bellerose

3

In jQuery ist das so

$(document).ready(function () {
  $('input').focus(function () {
    $(this).attr('value',$(this).attr('value'));
  }
}

2
Diese Funktion weist das Wertattribut nur dann dem Wert zu, wenn $ ('Eingabe') den Fokus erhält. Der Cursor wird nicht an das Zeilenende gesendet.
vrish88

3

Dieses Problem ist interessant. Das Verwirrendste daran ist, dass keine Lösung, die ich gefunden habe, das Problem vollständig gelöst hat.

+++++++ LÖSUNG +++++++

  1. Sie benötigen eine JS-Funktion wie folgt:

    function moveCursorToEnd(obj) {
    
      if (!(obj.updating)) {
        obj.updating = true;
        var oldValue = obj.value;
        obj.value = '';
        setTimeout(function(){ obj.value = oldValue; obj.updating = false; }, 100);
      }
    
    }
  2. Sie müssen diesen Typen in den Onfocus- und Onclick-Ereignissen anrufen.

    <input type="text" value="Test Field" onfocus="moveCursorToEnd(this)" onclick="moveCursorToEnd(this)">

ES FUNKTIONIERT AN ALLEN GERÄTEN UND BROWSERS !!!!


2

Ich habe gerade festgestellt, dass unter iOS die Einstellungseigenschaft textarea.textContentden Cursor jedes Mal am Ende des Textes im Textbereichselement platziert. Das Verhalten war ein Fehler in meiner App, scheint aber etwas zu sein, das Sie absichtlich verwenden könnten.


2
var valsrch = $('#search').val();
$('#search').val('').focus().val(valsrch);

Was macht diese Lösung besser als die vorhandene jQuery-Lösung?
Rovanion

Dies ist eine andere Lösung. Wenn Sie nicht die Erlaubnis haben, HTML-Dateien und nur Javascript zu redigieren, ist diese Lösung besser;) Ich hatte die gleiche Situation!
HanKrum

Diese Lösung hat bei mir funktioniert. Die andere jQuery-Lösung hat wahrscheinlich nichts damit zu tun, dass Sie den Eingabewert vor dem Fokussieren leer haben.
Talsibony

2

Nehmen Sie einige der Antworten .. machen Sie eine einzeilige Abfrage.

$('#search').focus().val($('#search').val());

1

Wenn das Eingabefeld nur einen statischen Standardwert benötigt, mache ich dies normalerweise mit jQuery:

$('#input').focus().val('Default value');

Dies scheint in allen Browsern zu funktionieren.


1

Obwohl dies eine alte Frage mit vielen Antworten sein mag, bin ich auf ein ähnliches Problem gestoßen, und keine der Antworten entsprach genau meinen Wünschen und / oder wurde schlecht erklärt. Das Problem mit den Eigenschaften selectionStart und selectionEnd besteht darin, dass sie für die Eingabetypnummer nicht vorhanden sind (während die Frage nach dem Texttyp gestellt wurde, kann dies meiner Meinung nach anderen helfen, die möglicherweise andere Eingabetypen haben, auf die sie sich konzentrieren müssen). Wenn Sie also nicht wissen, ob der Eingabetyp, auf den sich die Funktion konzentriert, eine Typennummer ist oder nicht, können Sie diese Lösung nicht verwenden.

Die Lösung, die browserübergreifend und für alle Eingabetypen funktioniert, ist recht einfach:

  • Abrufen und Speichern des Eingabewerts in einer Variablen
  • Fokussieren Sie die Eingabe
  • Setzen Sie den Wert der Eingabe auf den gespeicherten Wert

Auf diese Weise befindet sich der Cursor am Ende des Eingabeelements.
Alles, was Sie tun würden, ist so etwas (mit jquery, vorausgesetzt, der Element-Selektor, den Sie fokussieren möchten, ist über das Datenattribut 'data-focus-element' des angeklickten Elements zugänglich und die Funktion wird ausgeführt, nachdem Sie auf '.foo' geklickt haben. Element):

$('.foo').click(function() {
    element_selector = $(this).attr('data-focus-element');
    $focus = $(element_selector);
    value = $focus.val();
    $focus.focus();
    $focus.val(value);
});

Warum funktioniert das? Wenn einfach .focus () aufgerufen wird, wird der Fokus am Anfang des Eingabeelements hinzugefügt (was hier das Kernproblem ist), wobei die Tatsache ignoriert wird, dass das Eingabeelement bereits einen Wert enthält. Wenn jedoch der Wert einer Eingabe geändert wird, wird der Cursor automatisch am Ende des Werts innerhalb des Eingabeelements platziert. Wenn Sie also den Wert mit demselben Wert überschreiben, der zuvor in die Eingabe eingegeben wurde, bleibt der Wert unberührt, der Cursor bewegt sich jedoch zum Ende.


1

Versuchen Sie, dass dies mit Vanilla JavaScript funktioniert.

<input type="text" id="yourId" onfocus=" let value = this.value; this.value = null; this.value=value" name="nameYouWant" class="yourClass" value="yourValue" placeholder="yourPlaceholder...">

In Js

document.getElementById("yourId").focus()

0

Setzen Sie den Cursor, wenn Sie auf den Textbereich bis zum Ende des Textes klicken ... Variation dieses Codes ist ... AUCH funktioniert! für Firefox, IE, Safari, Chrome ..

Im serverseitigen Code:

txtAddNoteMessage.Attributes.Add("onClick", "sendCursorToEnd('" & txtAddNoteMessage.ClientID & "');")

In Javascript:

function sendCursorToEnd(obj) {
    var value =  $(obj).val(); //store the value of the element
    var message = "";
    if (value != "") {
        message = value + "\n";
     };
    $(obj).focus().val(message);
    $(obj).unbind();
 }

0

Wenn Sie zuerst den Wert und dann den Fokus einstellen, erscheint der Cursor immer am Ende.

$("#search-button").click(function (event) {
    event.preventDefault();
    $('#textbox').val('this');
    $("#textbox").focus();
    return false;
});

Hier ist die Geige zum Testen von https://jsfiddle.net/5on50caf/1/


0

Ich wollte den Cursor an das Ende eines "div" -Elements setzen, wobei contenteditable = true ist, und habe eine Lösung mit Xeoncross-Code erhalten :

<input type="button" value="Paste HTML" onclick="document.getElementById('test').focus(); pasteHtmlAtCaret('<b>INSERTED</b>'); ">

<div id="test" contenteditable="true">
    Here is some nice text
</div>

Und diese Funktion zaubert:

 function pasteHtmlAtCaret(html) {
    var sel, range;
    if (window.getSelection) {
        // IE9 and non-IE
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = sel.getRangeAt(0);
            range.deleteContents();

            // Range.createContextualFragment() would be useful here but is
            // non-standard and not supported in all browsers (IE9, for one)
            var el = document.createElement("div");
            el.innerHTML = html;
            var frag = document.createDocumentFragment(), node, lastNode;
            while ( (node = el.firstChild) ) {
                lastNode = frag.appendChild(node);
            }
            range.insertNode(frag);

            // Preserve the selection
            if (lastNode) {
                range = range.cloneRange();
                range.setStartAfter(lastNode);
                range.collapse(true);
                sel.removeAllRanges();
                sel.addRange(range);
            }
        }
    } else if (document.selection && document.selection.type != "Control") {
        // IE < 9
        document.selection.createRange().pasteHTML(html);
    }
}

Funktioniert gut für die meisten Browser. Bitte überprüfen Sie es. Dieser Code setzt Text und setzt den Fokus am Ende des Textes im div-Element (kein Eingabeelement).

https://jsfiddle.net/Xeoncross/4tUDk/

Danke, Xeoncross


0

Ich hatte auch das gleiche Problem. Endlich wird das für mich funktionieren:

jQuery.fn.putCursorAtEnd =  = function() {

  return this.each(function() {

    // Cache references
    var $el = $(this),
        el = this;

    // Only focus if input isn't already
    if (!$el.is(":focus")) {
     $el.focus();
    }

    // If this function exists... (IE 9+)
    if (el.setSelectionRange) {

      // Double the length because Opera is inconsistent about whether a carriage return is one character or two.
      var len = $el.val().length * 2;

      // Timeout seems to be required for Blink
      setTimeout(function() {
        el.setSelectionRange(len, len);
      }, 1);

    } else {

      // As a fallback, replace the contents with itself
      // Doesn't work in Chrome, but Chrome supports setSelectionRange
      $el.val($el.val());

    }

    // Scroll to the bottom, in case we're in a tall textarea
    // (Necessary for Firefox and Chrome)
    this.scrollTop = 999999;

  });

};

So können wir das nennen:

var searchInput = $("#searchInputOrTextarea");

searchInput
  .putCursorAtEnd() // should be chainable
  .on("focus", function() { // could be on any event
    searchInput.putCursorAtEnd()
  });

Es funktioniert für mich in Safari, IE, Chrome, Mozilla. Auf Mobilgeräten habe ich das nicht ausprobiert.


0

Überprüfen Sie diese Lösung!

//fn setCurPosition
$.fn.setCurPosition = function(pos) {
    this.focus();
    this.each(function(index, elem) {
        if (elem.setSelectionRange) {
            elem.setSelectionRange(pos, pos);
        } else if (elem.createTextRange) {
            var range = elem.createTextRange();
            range.collapse(true);
            range.moveEnd('character', pos);
            range.moveStart('character', pos);
            range.select();
        }
    });
    return this;
};

// USAGE - Set Cursor ends
$('#str1').setCurPosition($('#str1').val().length);

// USAGE - Set Cursor at 7 position
// $('#str2').setCurPosition(7);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Set cursor at any position</p>
<p><input type="text" id="str1" value="my string here" /></p>
<p><input type="text" id="str2" value="my string here" /></p>


0

Super einfach (möglicherweise müssen Sie sich auf das Eingabeelement konzentrieren)

inputEl = getElementById('inputId');
var temp = inputEl.value;
inputEl.value = '';
inputEl.value = temp;

-1

Ich habe die Vorschläge schon einmal ausprobiert, aber keiner hat für mich funktioniert (sie wurden in Chrome getestet), also habe ich meinen eigenen Code geschrieben - und er funktioniert gut in Firefox, IE, Safari, Chrome ...

Im Textbereich:

onfocus() = sendCursorToEnd(this);

In Javascript:

function sendCursorToEnd(obj) { 
var value = obj.value; //store the value of the element
var message = "";
if (value != "") {
    message = value + "\n";
};
$(obj).focus().val(message);}

-1

Hier ist eine jsFiddle-Demo meiner Antwort. Die Demo verwendet CoffeeScript, aber Sie können es in einfaches JavaScript konvertieren bei Bedarf in .

Der wichtige Teil in JavaScript:

var endIndex = textField.value.length;
if (textField.setSelectionRange) {
   textField.setSelectionRange(endIndex, endIndex);
}

Ich poste diese Antwort, weil ich sie bereits für jemanden geschrieben habe, der dieselbe Frage hatte. Diese Antwort deckt nicht so viele Randfälle ab wie die Top-Antworten hier, funktioniert aber für mich und enthält eine jsFiddle-Demo, mit der Sie spielen können.

Hier ist der Code aus der jsFiddle, sodass diese Antwort auch dann erhalten bleibt, wenn die jsFiddle verschwindet:

moveCursorToEnd = (textField) ->
  endIndex = textField.value.length
  if textField.setSelectionRange
    textField.setSelectionRange(endIndex, endIndex)

jQuery ->
  $('.that-field').on 'click', ->
    moveCursorToEnd(this)
<div class="field">
    <label for="pressure">Blood pressure</label>:
    <input class="that-field" type="text" name="pressure" id="pressure" value="24">
</div>
<p>
    Try clicking in the text field. The cursor will always jump to the end.
</p>
body {
    margin: 1em;
}

.field {
    margin-bottom: 1em;
}

-1

Versuchen Sie den folgenden Code:

$('input').focus(function () {
    $(this).val($(this).val());
}).focus()

1
Ist das Hinzufügen von nachgestellten Leerzeichen ein Nebeneffekt, den das OP angegeben hat?
Charles Duffy

Aber warum bekommt meine Antwort -2? Ich verstehe es nicht! Dies ist Beispiele, die es funktioniert
Msroot

Nachdem Sie den nicht spezifizierten Nebeneffekt behoben haben, ist er weniger offensichtlich falsch (im Sinne eines unerwünschten Verhaltens), aber ich kann verstehen, warum er vor diesem Punkt herabgestimmt worden wäre. Zu diesem Zeitpunkt ist der Grund, warum ich nicht stimme, möglicherweise eine schlechte Leistung. Das Lesen und Schreiben eines Werts von unbegrenzter Länge kann möglicherweise langsam sein. Der setSelectionRangeAnsatz ist sicherlich viel effizienter, wenn / wo unterstützt.
Charles Duffy

1
(Nun - das, und ich bin mir nicht sicher, was es zu vorhandenen Antworten hinzufügt, die auch durch Zurücksetzen des bereits vorhandenen Werts funktionierten. Wenn es etwas Neues / Wichtiges hinzufügt, fügen Sie einen Text hinzu, der beschreibt, was das ist, und nicht nur Code , würde helfen).
Charles Duffy

Sicher - und hat das OP in der Frage angegeben, dass sie einen Platz wollten? Wenn nicht, ist es nicht Teil der Spezifikation; also "nicht spezifiziert".
Charles Duffy

-1

Ich antworte zwar zu spät, aber für zukünftige Fragen wird es hilfreich sein. Und es funktioniert auch incontenteditable div.

Von wo aus müssen Sie am Ende den Fokus setzen; schreibe diesen Code-

var el = document.getElementById("your_element_id");
placeCaretAtEnd(el);

Und die Funktion ist -

function placeCaretAtEnd(el) {
    el.focus();
    if (typeof window.getSelection != "undefined"
            && typeof document.createRange != "undefined") {
        var range = document.createRange();
        range.selectNodeContents(el);
        range.collapse(false);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    } else if (typeof document.body.createTextRange != "undefined") {
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.collapse(false);
        textRange.select();
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.