Sử dụng JavaScript để đặt con trỏ ở cuối văn bản trong phần tử nhập văn bản


308

Cách tốt nhất (và tôi đoán là cách đơn giản nhất) để đặt con trỏ ở cuối văn bản trong phần tử văn bản đầu vào thông qua JavaScript - sau khi tiêu điểm đã được đặt thành phần tử?

Câu trả lời:


170

Tôi đã đối mặt với vấn đề tương tự (sau khi thiết lập tiêu điểm thông qua RJS / nguyên mẫu) trong IE. Firefox đã rời khỏi con trỏ ở cuối khi đã có một giá trị cho trường. IE đã buộc con trỏ đến đầu văn bản.

Giải pháp tôi đưa ra là như sau:

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

Điều này hoạt động trong cả IE7 và FF3


3
Nó sẽ là gì cho textarea?
Tareq

19
Hoạt động trong Chrome ngay bây giờ (9.0.597.98)
Matt

6
Điều này bây giờ không hoạt động trong IE9 - con trỏ nhảy đến đầu trường.
Thị trấn

6
Cũng không hoạt động trong FF 8. Mặc dù vậy, giải pháp từ chenosaurus dường như hoạt động.
simon

3
làm việc cho tôi trong Chrome 24.0.1312.57, IE 9.0.8112, nhưng không phải Firefox 18.0.2
Chris - Haddox Technologies

190

Có một cách đơn giản để làm cho nó hoạt động trong hầu hết các trình duyệt.

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

Tuy nhiên, do * sự kỳ quặc của một vài trình duyệt, một câu trả lời bao quát hơn trông giống như thế này

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

Sử dụng jQuery (để đặt trình nghe, nhưng không cần thiết khác)

Sử dụng Vanilla JS ( addEventhàm mượn từ câu trả lời này )


Quirks

Chrome có một cách giải quyết kỳ lạ khi sự kiện tiêu điểm kích hoạt trước khi con trỏ được di chuyển vào trường; mà vít giải pháp đơn giản của tôi lên. Hai tùy chọn để khắc phục điều này:

  1. Bạn có thể thêm thời gian chờ là 0 ms (để trì hoãn thao tác cho đến khi ngăn xếp rõ ràng )
  2. Bạn có thể thay đổi sự kiện từ focusđến mouseup. Điều này sẽ khá khó chịu cho người dùng trừ khi bạn vẫn theo dõi sự tập trung. Tôi không thực sự yêu một trong hai lựa chọn này.

Ngoài ra, @vladkras chỉ ra rằng một số phiên bản cũ của Opera tính toán không chính xác độ dài khi nó có khoảng trắng. Đối với điều này, bạn có thể sử dụng một số lượng lớn phải lớn hơn chuỗi của bạn.


2
làm việc cho tôi trong Chrome 24.0.1312.57, IE 9.0.8112 và Firefox 18.0.2
Chris - Haddox Technologies

4
Đây là một giải pháp tốt thay vì quan sát (kydge), ít mã hơn và dễ hiểu hơn thì các phương án được thảo luận ở đây. Cảm ơn.
Derek Litz

Tôi chỉ muốn làm điều đó cho sự kiện tập trung đầu tiên, và gọi nó ngay lập tức. Mặt khác, mỗi khi bạn nhấp vào trường, con trỏ sẽ được di chuyển đến cuối.
Damien

this.selectionStart = this.selectionEnd = 0; điều này sẽ di chuyển tiêu điểm trước chữ cái đầu tiên của hộp đầu vào. Nhưng thay vào đó, khi tôi gỡ lỗi, nó thậm chí không thay đổi giá trị của selectEnd và selectStart! Và cũng không di chuyển nó đến nhân vật đầu tiên !!
soham

1
Opera đã được báo cáo để làm việc không chính xác đôi khi với selectionStartlengthtrả lại số lượng nhỏ hơn trên không gian. Đó là lý do tại sao tôi sử dụng 10000hoặc bất kỳ số lượng đủ lớn nào khác thay vì this.value.length(đã thử nghiệm trên IE8 và IE11)
vladkras

160

Hãy thử điều này, nó đã làm việc cho tôi:

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

Để con trỏ được di chuyển đến cuối, đầu vào phải có tiêu điểm trước, sau đó khi giá trị được thay đổi, nó sẽ chuyển sang kết thúc. Nếu bạn đặt .value thành như nhau, nó sẽ không thay đổi trong chrome.


2
Điều này giống như onf Focus = "this.value = this.value;
Tareq

15
Đặt tiêu điểm trước khi đặt giá trị là chìa khóa để làm cho nó hoạt động trong Chrome.
anatoly techtonik

7
Tại sao đặt this.trước đầu vào trên dòng 2, 3 và 4? Chúng tôi đã biết đó inputlà yếu tố đầu vào. Sử dụng thiscó vẻ dư thừa. Giải pháp tốt khác!
The11

3
@Tareq Họ không giống nhau. Thủ thuật này tốt hơn nhiều so với câu trả lời được chấp nhận.
Lewis

4
Dễ dàng hơn:$input.focus().val($input.val());
milkovsky

99

Sau khi hack xung quanh với điều này một chút, tôi thấy cách tốt nhất là sử dụng setSelectionRange chức năng nếu trình duyệt hỗ trợ nó; nếu không, hãy quay lại sử dụng phương thức trong câu trả lời của Mike Berrow (nghĩa là thay thế giá trị bằng chính nó).

Tôi cũng đang thiết lập scrollTopmột giá trị cao trong trường hợp chúng ta có thể cuộn theo chiều dọc textarea. (Sử dụng giá trị cao tùy ý có vẻ đáng tin cậy hơn$(this).height() trong Firefox và Chrome.)

Tôi đã thực hiện nó như là một plugin jQuery. (Nếu bạn không sử dụng jQuery, tôi tin rằng bạn vẫn có thể nhận được ý chính đủ dễ dàng.)

Tôi đã thử nghiệm trong IE6, IE7, IE8, Firefox 3.5.5, Google Chrome 3.0, Safari 4.0.4, Opera 10:00.

Nó có sẵn trên jquery.com dưới dạng plugin PutC bổngAtEnd . Để thuận tiện cho bạn, mã cho bản phát hành 1.0 như sau:

// 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
Tại sao phải tính chiều dài? Tại sao không chỉ this.setSelectionRange (9999,9999) nếu bạn sẽ vượt qua nó?
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>  

Chức năng này hoạt động với tôi trong IE9, Firefox 6.x và Opera 11.x


Tuyệt vời, giải pháp sẵn sàng đầu tiên dường như hoạt động cho cả FF6 và IE8.
simon

3
Vì một số lý do, câu trả lời phổ biến không có tác dụng với tôi. Điều này làm việc hoàn hảo.
liệu

Không hoạt động với tôi trong IE9. Lỗi:SCRIPT16389: Unspecified error.
soham

1
Hoạt động hoàn hảo trong FF 46, Chrome 51 và IE 11.
webdevguy

Điều này hoạt động trong IE 8 trong khi một số tùy chọn khác thì không. Cảm ơn bạn.
BenMaddox

17

Tôi đã thử những điều sau đây với thành công khá lớn trong chrome

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

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

Nhanh chóng tải xuống:

Nó nhận mọi trường đầu vào với lớp tập trung vào nó, sau đó lưu giá trị cũ của trường đầu vào vào một biến, sau đó nó áp dụng chuỗi rỗng vào trường đầu vào.

Sau đó, nó đợi 1 triệu giây và đặt lại giá trị cũ.


hoàn hảo! Tất cả các giải pháp khác không hiệu quả với tôi, chỉ có giải pháp của bạn phù hợp với tôi. Có lẽ vì tôi đang sử dụng php để gán giá trị cho textarea và js không thể phát hiện giá trị nên js phải đợi trong 1 mili giây.
zac1987

3
@ zac1987 có lẽ không phải như vậy vì php sẽ kết xuất html, html sẽ được tải cho máy khách và sau đó js sẽ chạy. Có thể bạn không chờ đợi một sự kiện sẵn sàng cho tài liệu.
recbot

Chỉ cần chỉ ra rằng sử dụng setTimeout như thế có thể là nguyên nhân dẫn đến kết quả không thể đoán trước. Mã có thể hoạt động chính xác trong một số trường hợp như đôi khi một cái gì đó có thể thay đổi đầu vào trong 1ms mà val sẽ không được đặt lại. Ngoài ra, điều quan trọng cần lưu ý là 1ms giây là thời gian chờ tối thiểu. Vì vậy, nếu bạn có một số phương thức ràng buộc cpu, tiêu điểm có thể chờ hơn 1ms. Điều này sẽ làm cho UI không phản hồi. Và không cần thiết vì phương thức .val () sẽ kích hoạt các thay đổi UI.
Loïc Faure-Lacroix

10

Đó là năm 2019 và không có phương pháp nào ở trên hoạt động với tôi, nhưng phương pháp này đã được thực hiện, được lấy từ https://css-tricks.com/snippets/javascript/move-coder-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>


1
Cảm ơn @MaxAlexanderHanna, tôi chỉ el.focus()tham gia else ifvì vậy nó không hoạt động trong một số trường hợp. Tôi đã xác minh công việc này ngay bây giờ bằng chrome và (shudder) IE
Andy Raddatz

đã thử nghiệm và hoạt động trong cả IE và CHROME kể từ ngày 7/12/2019. Cảm ơn bạn, nâng cao.
Max Alexander Hanna

Thật tuyệt vời, điều này hoạt động trong Safari trên bản Catalina beta.
NetOperator Wibby

8

Đơn giản. Khi chỉnh sửa hoặc thay đổi giá trị, trước tiên hãy đặt tiêu điểm sau đó đặt giá trị.

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

Tiêu chuẩn cũ vẫn hoạt động ở đây trong Chrome và FF vào năm 2016.
Volomike

1
Câu trả lời hoàn hảo.
Partha Paul

7

Vẫn là biến trung gian là cần thiết, (xem var val =) khác con trỏ hành xử lạ, chúng ta cần nó ở cuối.

<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

Phương thức này cập nhật các thuộc tính HTMLInputEuity.selectionStart, selectEnd và selectDirection trong một cuộc gọi.

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

Trong các phương thức js khác -1thường có nghĩa là (đến) ký tự cuối cùng. Đây cũng là trường hợp này, nhưng tôi không thể tìm thấy đề cập rõ ràng về hành vi này trong các tài liệu.


Điều này làm việc hoàn hảo cho tôi và nó đơn giản nhất. +1
Chris Farr

Tôi cũng phải bao gồm onf Focus = "this.value = this.value;" từ câu trả lời của Mike Berrow
Chris Farr

5

Đối với tất cả các trình duyệt cho tất cả các trường hợp:

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

Hết thời gian chờ nếu bạn cần di chuyển con trỏ từ trình xử lý sự kiện onF Focus


lưu ý rằng điều này gây ra sự cố trên Android, vì lựa chọn phạm vi đưa dữ liệu vào bộ đệm bàn phím, điều đó có nghĩa là bất kỳ phím nào bạn nhập sẽ kết thúc sao chép văn bản trong đầu vào, không hữu ích nhất.
Mike 'Pomax' Kamermans

1
Điều này là tuyệt vời và làm việc tuyệt vời cho tôi trong tức là! Tôi có một loạt các yếu tố đầu vào cần một cuộn giấy và đó là những thứ kỳ lạ, vì vậy tôi đang tìm kiếm thứ gì đó mà tôi có thể sử dụng cho shim và đây là nó. Nó không hoạt động trong các trình duyệt khác, nhưng đối với những nơi không có gì hoạt động thì điều này thật tuyệt vời!
zazvorniki

5

Tôi thích câu trả lời được chấp nhận rất nhiều, nhưng nó đã ngừng hoạt động trong Chrome. Trong Chrome, để con trỏ đi đến cuối, giá trị đầu vào cần thay đổi. Giải pháp như sau:

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

1
Đây là giải pháp thực sự hoạt động trên Chrome đối với tôi bây giờ. Cú pháp là lạ nhưng hey, sẽ học cách sống với giải pháp này ngay bây giờ!
Sam Bellerose

3

Trong jQuery, đó là

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

2
Hàm này sẽ chỉ gán thuộc tính value cho value khi $ ('input') nhận được tiêu điểm. Nó sẽ không gửi con trỏ đến cuối dòng.
vrish88

3

Vấn đề này thật thú vị. Điều khó hiểu nhất về nó là không có giải pháp nào tôi tìm thấy đã giải quyết vấn đề hoàn toàn.

+++++++ GIẢI PHÁP +++++++

  1. Bạn cần một hàm JS, như thế này:

    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. Bạn cần gọi anh chàng này trong các sự kiện onf Focus và onclick.

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

CÔNG TRÌNH NÓ TRÊN TẤT CẢ CÁC THIẾT BỊ MỘT BROWSERS !!!!


2

Tôi chỉ thấy rằng trong iOS, cài đặt thuộc textarea.textContenttính sẽ đặt con trỏ ở cuối văn bản trong phần tử textarea mỗi lần. Hành vi là một lỗi trong ứng dụng của tôi, nhưng dường như là thứ mà bạn có thể sử dụng có chủ ý.


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

Giải pháp này làm gì tốt hơn giải pháp jQuery hiện có?
Rovmate

Đây là một giải pháp khác. Nếu bạn không có khả năng sắp xếp lại các tệp html và chỉ javascript, giải pháp này sẽ nhẹ nhàng hơn;) Tôi đã gặp tình huống tương tự!
HanKrum

giải pháp này hiệu quả với tôi, giải pháp jQuery khác có lẽ không liên quan đến thực tế là bạn làm trống giá trị đầu vào trước khi tập trung vào nó.
talsibony

2

Lấy một số câu trả lời .. làm một câu đố đơn dòng.

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

1

Nếu trường đầu vào chỉ cần một giá trị mặc định tĩnh, tôi thường làm điều này với jQuery:

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

Điều này dường như hoạt động trong tất cả các trình duyệt.


1

Mặc dù đây có thể là một câu hỏi cũ với rất nhiều câu trả lời, tôi đã gặp một vấn đề tương tự và không có câu trả lời nào đúng như tôi muốn và / hoặc được giải thích kém. Vấn đề với các thuộc tính selectStart và selectEnd là chúng không tồn tại cho số loại đầu vào (trong khi câu hỏi được hỏi về loại văn bản, tôi cho rằng nó có thể giúp những người khác có thể có các loại đầu vào khác mà họ cần tập trung). Vì vậy, nếu bạn không biết liệu loại đầu vào mà hàm sẽ tập trung có phải là số loại hay không, bạn không thể sử dụng giải pháp đó.

Giải pháp hoạt động trên nhiều trình duyệt và cho tất cả các loại đầu vào khá đơn giản:

  • nhận và lưu trữ giá trị của đầu vào trong một biến
  • tập trung đầu vào
  • đặt giá trị đầu vào thành giá trị được lưu trữ

Bằng cách đó, con trỏ ở cuối phần tử đầu vào.
Vì vậy, tất cả những gì bạn làm là một cái gì đó như thế này (sử dụng jquery, với điều kiện bộ chọn phần tử mà một người muốn lấy nét có thể truy cập được thông qua thuộc tính dữ liệu 'tập trung dữ liệu' của phần tử được nhấp và hàm thực thi sau khi nhấp vào '.foo' thành phần):

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

Tại sao điều này làm việc? Đơn giản, khi gọi .f Focus (), tiêu điểm sẽ được thêm vào đầu phần tử đầu vào (đây là vấn đề cốt lõi ở đây), bỏ qua thực tế là phần tử đầu vào đã có giá trị trong đó. Tuy nhiên, khi giá trị của đầu vào bị thay đổi, con trỏ sẽ tự động được đặt ở cuối giá trị bên trong phần tử đầu vào. Vì vậy, nếu bạn ghi đè giá trị bằng cùng giá trị đã được nhập trước đó vào đầu vào, giá trị sẽ trông không bị ảnh hưởng, tuy nhiên, con trỏ sẽ di chuyển đến cuối.


1

Hãy thử cái này hoạt động với 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...">

Trong Js

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

0

Đặt con trỏ khi nhấp vào vùng văn bản ở cuối văn bản ... Biến thể của mã này là ... CSONG hoạt động! cho Firefox, IE, Safari, Chrome ..

Trong mã phía máy chủ:

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

Trong 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

Nếu bạn đặt giá trị trước rồi đặt tiêu điểm, con trỏ sẽ luôn xuất hiện ở cuối.

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

Dưới đây là mẹo để kiểm tra https://jsfiddle.net/5on50caf/1/


0

Tôi muốn đặt con trỏ ở cuối phần tử "div" trong đó contenteditable = true và tôi đã có một giải pháp với mã 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>

Và chức năng này làm phép thuật:

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

Hoạt động tốt đối với hầu hết các trình duyệt, vui lòng kiểm tra nó, mã này đặt văn bản và đặt tiêu điểm ở cuối văn bản trong phần tử div (không phải phần tử đầu vào)

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

Cảm ơn, Xeoncross


0

Tôi cũng phải đối mặt với vấn đề tương tự. Cuối cùng, điều này sẽ làm việc cho tôi:

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;

  });

};

Đây là cách chúng ta có thể gọi đây:

var searchInput = $("#searchInputOrTextarea");

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

Nó hoạt động với tôi trong safari, IE, Chrome, Mozilla. Trên thiết bị di động tôi đã không thử điều này.


0

Kiểm tra giải pháp này!

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

Siêu dễ (bạn có thể phải tập trung vào yếu tố đầu vào)

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

-1

Tôi đã thử các đề xuất trước đây nhưng không có gợi ý nào cho tôi (đã thử nghiệm chúng trong Chrome), vì vậy tôi đã viết mã của riêng mình - và nó hoạt động tốt trong Firefox, IE, Safari, Chrome ...

Trong văn bản:

onfocus() = sendCursorToEnd(this);

Trong 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

Đây là bản demo jsFiddle về câu trả lời của tôi. Bản demo sử dụng CoffeeScript, nhưng bạn có thể chuyển đổi nó thành JavaScript đơn giản nếu bạn cần.

Phần quan trọng, trong JavaScript:

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

Tôi đang đăng câu trả lời này vì tôi đã viết nó cho người khác có cùng câu hỏi. Câu trả lời này không bao gồm nhiều trường hợp cạnh như các câu trả lời hàng đầu ở đây, nhưng nó hoạt động với tôi và có bản demo jsFiddle mà bạn có thể chơi.

Đây là mã từ jsFiddle, vì vậy câu trả lời này được giữ nguyên ngay cả khi jsFiddle biến mất:

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

Hãy thử đoạn mã sau:

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

1
Việc thêm khoảng trắng theo sau có phải là tác dụng phụ mà OP đã cho biết họ mong muốn không?
Charles Duffy

Nhưng tại sao câu trả lời của tôi nhận được -2? Tôi không hiểu Đây là ví dụ nó hoạt động
msroot

Bây giờ bạn đã khắc phục hiệu ứng phụ không xác định, rõ ràng là ít sai (theo nghĩa hành vi không mong muốn), nhưng tôi có thể hiểu tại sao nó lại bị giảm xuống trước thời điểm đó. Tại thời điểm này, lý do tôi không nâng cao khả năng thực hiện kém - đọc và viết một giá trị có độ dài không giới hạn có khả năng bị chậm; các setSelectionRangephương pháp chắc chắn là hiệu quả hơn khi / nơi được hỗ trợ.
Charles Duffy

1
(Chà - điều đó và tôi không chắc nó bổ sung gì cho các câu trả lời hiện có cũng hoạt động bằng cách đặt lại giá trị có sẵn; nếu nó thêm một cái gì đó mới / quan trọng, hãy thêm một số văn bản mô tả đó là gì, thay vì chỉ mã , sẽ giúp).
Charles Duffy

Chắc chắn - và OP đã chỉ ra trong câu hỏi rằng họ muốn có một không gian? Nếu không, nó không phải là một phần của đặc điểm kỹ thuật; do đó, "không xác định".
Charles Duffy

-1

Mặc dù tôi trả lời quá muộn, nhưng đối với truy vấn trong tương lai, nó sẽ hữu ích. Và nó cũng hoạt động trong contenteditablediv.

Từ nơi bạn cần đặt trọng tâm ở cuối; viết mã này-

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

Và chức năng là -

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();
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.