Gunakan JavaScript untuk menempatkan kursor di akhir teks dalam elemen input teks

317

Apa cara terbaik (dan saya anggap cara paling sederhana) untuk menempatkan kursor di akhir teks dalam elemen teks input melalui JavaScript - setelah fokus ditetapkan ke elemen?

Kacang
sumber

Jawaban:

177

Saya menghadapi masalah yang sama (setelah mengatur fokus melalui RJS / prototipe) di IE. Firefox sudah meninggalkan kursor di bagian akhir ketika sudah ada nilai untuk bidang tersebut. IE sedang memaksa kursor ke awal teks.

Solusi yang saya dapatkan adalah sebagai berikut:

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

Ini bekerja di IE7 dan FF3

Mike Berrow
sumber
3
Apa itu untuk textarea?
Tareq
19
Bekerja di Chrome sekarang (9.0.597.98)
Matt
6
Ini sekarang tidak berfungsi di IE9 - kursor melompat ke awal bidang.
Kota
6
Juga tidak bekerja di FF 8. Solusi dari chenosaurus tampaknya berhasil.
simon
3
bekerja untuk saya di Chrome 24.0.1312.57, IE 9.0.8112, tetapi tidak dengan Firefox 18.0.2
Chris - Haddox Technologies
194

Ada cara sederhana untuk membuatnya berfungsi di sebagian besar browser.

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

Namun, karena * kebiasaan beberapa browser, jawaban yang lebih inklusif terlihat lebih seperti ini

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

Menggunakan jQuery (untuk mengatur pendengar, tetapi tidak perlu sebaliknya)

Menggunakan Vanilla JS (meminjam addEventfungsi dari jawaban ini )


Quirks

Chrome memiliki kekhasan aneh di mana acara fokus diaktifkan sebelum kursor dipindahkan ke lapangan; yang mengacaukan solusi sederhana saya. Dua opsi untuk memperbaikinya:

  1. Anda dapat menambahkan waktu tunggu 0 ms (untuk menunda operasi hingga tumpukan bersih )
  2. Anda dapat mengubah acara dari focusmenjadi mouseup. Ini akan sangat mengganggu bagi pengguna kecuali Anda tetap fokus. Saya tidak benar-benar menyukai salah satu dari opsi ini.

Selain itu, @vladkras menunjukkan bahwa beberapa versi Opera yang lebih lama salah menghitung panjangnya ketika ada spasi. Untuk ini, Anda dapat menggunakan angka besar yang harus lebih besar dari string Anda.

Gary
sumber
2
bekerja untuk saya di Chrome 24.0.1312.57, IE 9.0.8112 dan Firefox 18.0.2
Chris - Haddox Technologies
4
Ini adalah solusi yang baik daripada observasi (kludge), lebih sedikit kode, dan lebih bisa dimengerti daripada alternatif yang dibahas di sini. Terima kasih.
Derek Litz
Saya lebih suka melakukannya hanya untuk acara fokus pertama, dan langsung memutuskannya. Jika tidak, setiap Anda mengklik di lapangan, kursor akan dipindahkan ke ujung.
Damien
this.selectionStart = this.selectionEnd = 0; ini harus memindahkan fokus sebelum huruf pertama dari kotak masukan. Melainkan, ketika saya men-debug itu bahkan tidak mengubah nilai selectionEnd dan selectionStart! Dan juga tidak memindahkannya ke karakter pertama !!
soham
1
Opera dilaporkan bekerja secara tidak benar kadang-kadang dengan selectionStartdan lengthmengembalikan jumlah spasi yang lebih kecil. Itu sebabnya saya menggunakan 10000atau nomor lain yang cukup besar daripada this.value.length(diuji pada IE8 dan IE11)
vladkras
165

Coba ini, ini berhasil untuk saya:

//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.  

Untuk kursor yang akan digerakkan ke ujung, masukan harus memiliki fokus terlebih dahulu, kemudian ketika nilai diubah akan menuju ke ujung. Jika Anda menyetel .value menjadi sama, ini tidak akan berubah di chrome.

chenosaurus
sumber
2
Ini seperti onfocus = "this.value = this.value;
Tareq
16
Menyetel fokus sebelum menyetel nilainya adalah kunci untuk membuatnya berfungsi di Chrome.
anatoly techtonik
8
Mengapa diletakkan this.di depan masukan pada baris 2, 3, dan 4? Kita sudah tahu itu inputadalah elemen masukan. Menggunakan thistampaknya mubazir. Solusi bagus sebaliknya!
The111
3
@Tareq Mereka tidak sama. Trik ini jauh lebih baik daripada jawaban yang diterima.
Lewis
4
Lebih mudah:$input.focus().val($input.val());
milkovsky
99

Setelah sedikit meretas ini, saya menemukan cara terbaik adalah menggunakan setSelectionRangefungsi tersebut jika browser mendukungnya; jika tidak, kembalilah menggunakan metode dalam jawaban Mike Berrow (yaitu, ganti nilainya dengan dirinya sendiri).

Saya juga menyetel scrollTopke nilai tinggi jika kita berada dalam scrollable vertikal textarea. (Menggunakan nilai tinggi yang sewenang-wenang tampaknya lebih dapat diandalkan daripada $(this).height()di Firefox dan Chrome.)

Saya telah membuatnya sebagai plugin jQuery. (Jika Anda tidak menggunakan jQuery, saya percaya Anda masih bisa mendapatkan intinya dengan cukup mudah.)

Saya telah menguji di IE6, IE7, IE8, Firefox 3.5.5, Google Chrome 3.0, Safari 4.0.4, Opera 10.00.

Ini tersedia di jquery.com sebagai plugin PutCursorAtEnd . Demi kenyamanan Anda, kode untuk rilis 1.0 adalah sebagai berikut:

// 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);
teedyay
sumber
4
Mengapa menghitung panjangnya? Mengapa tidak hanya this.setSelectionRange (9999,9999) jika Anda ingin melampaui batasnya?
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>  

Fungsi ini berfungsi untuk saya di IE9, Firefox 6.x, dan Opera 11.x

Hallgeir Engen
sumber
Solusi hebat dan siap pertama yang tampaknya berfungsi untuk FF6 dan IE8.
simon
3
Untuk beberapa alasan jawaban populer tidak berhasil untuk saya. Ini bekerja dengan sempurna.
metrik152
Tidak bekerja untuk saya di IE9. Kesalahan:SCRIPT16389: Unspecified error.
soham
1
Bekerja dengan sempurna di FF 46, Chrome 51, dan IE 11.
webdevguy
Ini berfungsi di IE 8 sementara beberapa opsi lain tidak. Terima kasih.
BenMaddox
18

Saya telah mencoba yang berikut ini dengan cukup sukses di chrome

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

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

Ikhtisar cepat:

Ini mengambil setiap bidang masukan dengan fokus kelas di atasnya, lalu menyimpan nilai lama bidang masukan dalam variabel, setelah itu menerapkan string kosong ke bidang masukan.

Kemudian menunggu 1 milidetik dan memasukkan nilai lama lagi.

Hejner
sumber
sempurna! Semua solusi lain tidak berhasil untuk saya, hanya solusi Anda yang berhasil untuk saya. Mungkin karena saya menggunakan php untuk memberikan nilai ke textarea, dan js tidak dapat mendeteksi nilai jadi js harus menunggu selama 1 milidetik.
zac1987
3
@ zac1987 itu mungkin tidak terjadi karena php akan membuat html, html akan dimuat ke klien dan kemudian js akan berjalan. Kemungkinan Anda tidak menunggu acara siap dokumen.
Reconbot
Hanya untuk menunjukkan bahwa menggunakan setTimeout seperti itu dapat menyebabkan hasil yang tidak dapat diprediksi. Kode dapat berperilaku dengan benar dalam beberapa keadaan seperti kadang-kadang sesuatu dapat mengubah input selama 1ms itu sehingga val tidak akan disetel kembali. Juga penting untuk dicatat bahwa 1ms detik adalah waktu tunggu minimum. Jadi jika Anda memiliki beberapa metode terikat cpu, fokusnya mungkin menunggu lebih dari 1ms. Ini akan membuat UI tidak responsif. Dan itu tidak perlu karena metode .val () harus memicu perubahan UI.
Loïc Faure-Lacroix
12

Ini tahun 2019 dan tidak ada metode di atas yang berhasil untuk saya, tetapi yang ini berhasil, diambil dari https://css-tricks.com/snippets/javascript/move-cursor-to-end-of-input/

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>

Andy Raddatz
sumber
1
Terima kasih @MaxAlexanderHanna, saya hanya punya el.focus()di else ifjadi itu tidak berfungsi dalam beberapa kasus. Saya memverifikasi ini berfungsi sekarang di chrome dan (gemetar) IE
Andy Raddatz
diuji dan berfungsi di IE dan CHROME pada 7/12/2019. Terima kasih, suara positif.
Max Alexander Hanna
Fantastis, ini berfungsi di Safari pada Catalina beta.
NetOperator Wibby
8

Sederhana. Saat mengedit atau mengubah nilai, pertama-tama taruh fokus lalu tetapkan nilainya.

$("#catg_name").focus();
$("#catg_name").val(catg_name);
Arun Prasad ES
sumber
Standar lama masih berfungsi di sini di Chrome dan FF pada 2016.
Volomike
1
Jawaban yang tepat.
Partha Paul
7

Masih diperlukan variabel perantara, (lihat var val =) jika tidak kursor berperilaku aneh, kita membutuhkannya di akhir.

<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>
Adrian
sumber
6

el.setSelectionRange(-1, -1);

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

Metode ini memperbarui properti HTMLInputElement.selectionStart, selectionEnd, dan selectionDirection dalam satu panggilan.

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

Dalam metode js lain -1biasanya berarti (ke) karakter terakhir. Ini juga kasus yang satu ini, tetapi saya tidak dapat menemukan penyebutan eksplisit tentang perilaku ini di dokumen.

seeker_of_bacon
sumber
Ini bekerja dengan sempurna untuk saya dan paling sederhana. +1
Chris Farr
Saya juga harus menyertakan onfocus = "this.value = this.value;" dari jawaban Mike Berrow
Chris Farr
5

Untuk semua browser untuk semua kasus:

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);
}

Waktu tunggu diperlukan jika Anda perlu memindahkan kursor dari pengendali kejadian onFocus

terma
sumber
Perhatikan bahwa hal ini menyebabkan masalah di Android, karena pemilihan rentang menempatkan data ke dalam buffer keyboard, yang berarti bahwa tombol apa pun yang Anda ketikkan pada akhirnya akan menduplikasi teks di masukan, yang sebenarnya bukan yang paling berguna.
Mike 'Pomax' Kamermans
1
Ini luar biasa dan bekerja luar biasa untuk saya di ie! Saya memiliki banyak input yang membutuhkan scrollLeft dan melakukan hal-hal aneh, jadi saya mencari sesuatu yang dapat saya gunakan untuk shim dan ini dia. Ini tidak berfungsi di browser lain, tetapi untuk tidak ada yang berfungsi, ini luar biasa!
zazvorniki
5

Saya sangat menyukai jawaban yang diterima, tetapi berhenti berfungsi di Chrome. Di Chrome, agar kursor berada di ujung, nilai masukan perlu diubah. Solusinya adalah sebagai berikut:

<input id="search" type="text" value="mycurrtext" size="30" 
   onfocus="var value = this.value; this.value = null; this.value = value;" name="search"/>
Konrad G
sumber
1
Ini adalah solusi yang benar-benar berfungsi di Chrome untuk saya sekarang. Sintaksnya aneh tapi hei, akan belajar hidup dengan solusi ini untuk saat ini!
Sam Bellerose
4

Coba yang ini bekerja dengan Vanilla JavaScript.

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

Di Js

document.getElementById("yourId").focus()
Kishore Newton
sumber
3

Di jQuery, itu

$(document).ready(function () {
  $('input').focus(function () {
    $(this).attr('value',$(this).attr('value'));
  }
}
Anonim
sumber
3
Fungsi ini hanya akan menetapkan atribut nilai ke nilai ketika $ ('input') menerima fokus. Ini tidak akan mengirim kursor ke akhir baris.
vrish88
3

Masalah ini menarik. Hal yang paling membingungkan tentang itu adalah bahwa tidak ada solusi yang saya temukan dapat memecahkan masalah sepenuhnya.

+++++++ SOLUSI +++++++

  1. Anda membutuhkan fungsi JS, seperti ini:

    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. Anda perlu memanggil orang ini dalam acara onfocus dan onclick.

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

ITU BEKERJA DI SEMUA PERANGKAT, BROWSERS !!!!

Pedro Ferreira
sumber
2

Saya baru saja menemukan bahwa di iOS, textarea.textContentproperti pengaturan akan menempatkan kursor di akhir teks di elemen textarea setiap saat. Perilaku tersebut adalah bug di aplikasi saya, tetapi tampaknya menjadi sesuatu yang dapat Anda gunakan dengan sengaja.

Joey Guerra
sumber
2
var valsrch = $('#search').val();
$('#search').val('').focus().val(valsrch);
HanKrum
sumber
Apa yang dilakukan solusi ini lebih baik daripada solusi jQuery yang ada?
Rovanion
Ini adalah solusi lain. Jika Anda tidak memiliki izin untuk menyunting file html dan hanya javascript, solusi ini lebih baik;) Saya memiliki situasi yang sama!
HanKrum
solusi ini bekerja untuk saya solusi jQuery lainnya mungkin tidak terkait dengan fakta Anda mengosongkan nilai input sebelum memfokuskannya.
talsibony
2

Mengambil beberapa jawaban .. membuat jquery satu baris.

$('#search').focus().val($('#search').val());
Ravi Ram
sumber
1

Jika kolom input hanya membutuhkan nilai default statis, saya biasanya melakukan ini dengan jQuery:

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

Sepertinya ini berfungsi di semua browser.

Decko
sumber
1

Meskipun ini mungkin pertanyaan lama dengan banyak jawaban, saya menemukan masalah serupa dan tidak ada jawaban yang sesuai dengan keinginan saya dan / atau penjelasannya buruk. Masalah dengan properti selectionStart dan selectionEnd adalah properti tersebut tidak ada untuk nomor jenis masukan (sementara pertanyaan ditanyakan untuk jenis teks, saya rasa ini mungkin membantu orang lain yang mungkin memiliki jenis masukan lain yang perlu mereka fokuskan). Jadi, jika Anda tidak tahu apakah tipe input yang akan difokuskan oleh fungsi adalah tipe angka atau bukan, Anda tidak dapat menggunakan solusi itu.

Solusi yang berfungsi lintas browser dan untuk semua jenis input cukup sederhana:

  • dapatkan dan simpan nilai input dalam variabel
  • fokuskan masukan
  • atur nilai input ke nilai yang disimpan

Dengan cara itu kursor berada di akhir elemen masukan.
Jadi yang akan Anda lakukan adalah sesuatu seperti ini (menggunakan jquery, asalkan pemilih elemen yang ingin difokuskan dapat diakses melalui atribut data 'data-focus-element' dari elemen yang diklik dan fungsi dijalankan setelah mengklik '.foo' elemen):

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

Mengapa ini berhasil? Sederhananya, ketika .focus () dipanggil, fokus akan ditambahkan ke awal elemen input (yang merupakan masalah inti di sini), mengabaikan fakta, bahwa elemen input sudah memiliki nilai di dalamnya. Namun, ketika nilai input berubah, kursor secara otomatis ditempatkan di akhir nilai di dalam elemen input. Jadi jika Anda mengganti nilai dengan nilai yang sama yang telah dimasukkan sebelumnya pada input, nilai akan terlihat tidak tersentuh, namun kursor akan berpindah ke akhir.

l.varga
sumber
0

Setel kursor saat mengklik area teks ke akhir teks ... Variasi kode ini ... JUGA berfungsi! untuk Firefox, IE, Safari, Chrome ..

Dalam kode sisi server:

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

Dalam 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();
 }
shirlymp
sumber
0

Jika Anda menyetel nilainya terlebih dahulu, lalu menyetel fokus, kursor akan selalu muncul di bagian akhir.

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

Ini biola untuk diuji https://jsfiddle.net/5on50caf/1/

Usman Shaukat
sumber
0

Saya ingin meletakkan kursor di akhir elemen "div" di mana contenteditable = true, dan saya mendapat solusi dengan kode Xeoncross :

<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>

Dan fungsi ini melakukan keajaiban:

 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);
    }
}

Berfungsi dengan baik untuk sebagian besar browser, harap periksa, kode ini meletakkan teks dan meletakkan fokus di akhir teks dalam elemen div (bukan elemen input)

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

Terima kasih, Xeoncross

Lexsoul
sumber
0

Saya juga menghadapi masalah yang sama. Akhirnya ini akan berhasil untuk saya:

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;

  });

};

Beginilah cara kita menyebutnya:

var searchInput = $("#searchInputOrTextarea");

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

Ini berfungsi untuk saya di safari, IE, Chrome, Mozilla. Di perangkat seluler saya tidak mencoba ini.

amku91
sumber
0

Periksa solusi ini!

//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>

Roberto Godoy
sumber
0

Sangat mudah (Anda mungkin harus fokus pada elemen masukan)

inputEl = getElementById('inputId');
var temp = inputEl.value;
inputEl.value = '';
inputEl.value = temp;
Eli
sumber
-1

Saya mencoba saran sebelumnya tetapi tidak ada yang berhasil untuk saya (mengujinya di Chrome), jadi saya menulis kode saya sendiri - dan berfungsi dengan baik di Firefox, IE, Safari, Chrome ...

Di Textarea:

onfocus() = sendCursorToEnd(this);

Dalam 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);}
shirlymp
sumber
-1

Berikut demo jsFiddle jawaban saya. Demo menggunakan CoffeeScript, tetapi Anda dapat mengonversinya menjadi JavaScript biasa jika perlu.

Bagian penting, di JavaScript:

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

Saya memposting jawaban ini karena saya sudah menulisnya untuk orang lain yang memiliki pertanyaan yang sama. Jawaban ini tidak mencakup kasus tepi sebanyak jawaban teratas di sini, tetapi berfungsi untuk saya, dan memiliki demo jsFiddle yang dapat Anda mainkan.

Berikut adalah kode dari jsFiddle, jadi jawaban ini akan disimpan meskipun jsFiddle menghilang:

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;
}
Rory O'Kane
sumber
-1

Coba kode berikut:

$('input').focus(function () {
    $(this).val($(this).val());
}).focus()
msroot.dll
sumber
1
Apakah menambahkan spasi kosong merupakan efek samping yang ditunjukkan OP yang mereka inginkan?
Charles Duffy
Tapi kenapa jawaban saya mendapatkan -2? Saya tidak mengerti! Ini adalah contoh kerjanya
msroot
Sekarang setelah Anda memperbaiki efek samping yang tidak ditentukan, itu kurang jelas salah (dalam pengertian perilaku yang tidak diinginkan), tetapi saya dapat memahami mengapa itu akan diturunkan sebelum titik itu. Pada titik ini, alasan saya tidak menaikkan suara adalah kinerja yang berpotensi buruk - membaca dan menulis nilai dengan panjang tak terbatas berpotensi lambat; yang setSelectionRangependekatan ini tentu jauh lebih efisien bila / dimana didukung.
Charles Duffy
1
(Ya - itu, dan saya tidak yakin apa yang ditambahkannya ke jawaban yang ada yang juga berfungsi dengan mengatur ulang nilai yang sudah ada sebelumnya; jika itu menambahkan sesuatu yang baru / penting, menambahkan beberapa teks yang menjelaskan apa itu, bukan hanya kode , akan membantu).
Charles Duffy
Tentu - dan apakah OP menunjukkan dalam pertanyaan bahwa mereka menginginkan ruang? Jika tidak, itu bukan bagian dari spesifikasi; dengan demikian, "tidak ditentukan".
Charles Duffy
-1

Meskipun saya terlambat menjawab, tetapi untuk pertanyaan selanjutnya, ini akan sangat membantu. Dan itu juga bekerja di contenteditablediv.

Dari mana Anda perlu menetapkan fokus pada akhirnya; tulis kode ini-

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

Dan fungsinya adalah -

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();
    }
}
Mahfuzur Rahman
sumber