106

This question has been asked in a few different formats but I can't get any of the answers to work in my scenario.

I am using jQuery to implement command history when user hits up/down arrows. When up arrow is hit, I replace the input value with previous command and set focus on the input field, but want the cursor always to be positioned at the end of the input string.

My code, as is:

$(document).keydown(function(e) { var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; var input = self.shell.find('input.current:last'); switch(key) { case 38: // up lastQuery = self.queries[self.historyCounter-1]; self.historyCounter--; input.val(lastQuery).focus(); // and it continues on from there 

How can I force the cursor to be placed at the end of 'input' after focus?

0

20 Answers 20

158

Looks like clearing the value after focusing and then resetting works.

input.focus(); var tmpStr = input.val(); input.val(''); input.val(tmpStr); 
Sign up to request clarification or add additional context in comments.

9 Comments

This is the only solution I've been able to find that works cross-browser. Kudos to you!
This works fine with FF and chrome but not in IE.. any one know how to solve this issue in IE ?
Note also you can chain the calls: var temp = input.focus().val(); input.val('').val(temp);
This can get even simpler: input.focus().val(input.val());
Doesn't seem to work with contenteditable elements for some reason, maybe as one has to use .html() rather than .val()
|
56

It looks a little odd, even silly, but this is working for me:

input.val(lastQuery); input.focus().val(input.val()); 

Now, I'm not certain I've replicated your setup. I'm assuming input is an <input> element.

By re-setting the value (to itself) I think the cursor is getting put at the end of the input. Tested in Firefox 3 and MSIE7.

4 Comments

Yes, input is an <input> element. I tried this and it didn't work in FF3 or Safari 4
Any update on this? Worked for me. Update question or add an answer if you found a solution.
In FF15 this sets the cursor to the begin of the input field. Other than that its working fine. Do you have a solution for FF as well?
@JochenJung I have not looked at this since 2009 - it worked then with FF3 and jQuery. If you come up with a solution using current jQuery and FF15, please feel free to edit this post.
54

Hope this help you:

var fieldInput = $('#fieldName'); var fldLength= fieldInput.val().length; fieldInput.focus(); fieldInput[0].setSelectionRange(fldLength, fldLength); 

3 Comments

Works fine, I think this is a better solution than resetting the value, especially when there's some kind of model-view-binding.
This is the right answer, setting exactly what you want to set without kludging it.
this solution is no longer working. it give "Uncaught DOMException: An attempt was made to use an object that is not, or is no longer, usable"
16

Chris Coyier has a mini jQuery plugin for this which works perfectly well: http://css-tricks.com/snippets/jquery/move-cursor-to-end-of-textarea-or-input/

It uses setSelectionRange if supported, else has a solid fallback.

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

Then you can just do:

input.putCursorAtEnd(); 

1 Comment

Amazing thanks, only solution I've found come 2020 that seems to work reliably.
13

Ref: @will824 Comment, This solution worked for me with no compatibility issues. Rest of solutions failed in IE9.

var input = $("#inputID"); var tmp = input.val(); input.focus().val("").blur().focus().val(tmp); 

Tested and found working in:

Firefox 33 Chrome 34 Safari 5.1.7 IE 9 

Comments

12

What about in one single line...

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

This line works for me.

Comments

8

2 artlung's answer: It works with second line only in my code (IE7, IE8; Jquery v1.6):

var input = $('#some_elem'); input.focus().val(input.val()); 

Addition: if input element was added to DOM using JQuery, a focus is not set in IE. I used a little trick:

input.blur().focus().val(input.val()); 

1 Comment

This kind of worked for me, but I had to do something like: var input = $("#inputID"); tmp = input.val(); input.focus().val("").blur().focus().val(tmp);
6

I know this answer comes late, but I can see people havent found an answer. To prevent the up key to put the cursor at the start, just return false from the method handling the event. This stops the event chain that leads to the cursor movement. Pasting revised code from the OP below:

$(document).keydown(function(e) { var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; var input = self.shell.find('input.current:last'); switch(key) { case 38: // up lastQuery = self.queries[self.historyCounter-1]; self.historyCounter--; input.val(lastQuery).focus(); // HERE IS THE FIX: return false; // and it continues on from there 

1 Comment

You can reduce second line to var key = e.charCode || e.keyCode || 0;
6

I use code below and it works fine

function to_end(el) { var len = el.value.length || 0; if (len) { if ('setSelectionRange' in el) el.setSelectionRange(len, len); else if ('createTextRange' in el) {// for IE var range = el.createTextRange(); range.moveStart('character', len); range.select(); } } } 

Comments

6

It will be different for different browsers:

This works in ff:

 var t =$("#INPUT"); var l=$("#INPUT").val().length; $(t).focus(); var r = $("#INPUT").get(0).createTextRange(); r.moveStart("character", l); r.moveEnd("character", l); r.select(); 

More details are in these articles here at SitePoint, AspAlliance.

Comments

4

like other said, clear and fill worked for me:

 var elem = $('#input_field'); var val = elem.val(); elem.focus().val('').val(val); 

Comments

3

set the value first. then set the focus. when it focuses, it will use the value that exists at the time of focus, so your value must be set first.

this logic works for me with an application that populates an <input> with the value of a clicked <button>. val() is set first. then focus()

$('button').on('click','',function(){ var value = $(this).attr('value'); $('input[name=item1]').val(value); $('input[name=item1]').focus(); }); 

1 Comment

U can make it more simple one line instead of two: $('input[name=item1]').val(value).focus();
2

I have found the same thing as suggested above by a few folks. If you focus() first, then push the val() into the input, the cursor will get positioned to the end of the input value in Firefox,Chrome and IE. If you push the val() into the input field first, Firefox and Chrome position the cursor at the end, but IE positions it to the front when you focus().

$('element_identifier').focus().val('some_value') 

should do the trick (it always has for me anyway).

Comments

2

At the first you have to set focus on selected textbox object and next you set the value.

$('#inputID').focus(); $('#inputID').val('someValue') 

1 Comment

I tried this but doesnot work. Does it also work for you with a div content editable set to true?
2
 function focusCampo(id){ var inputField = document.getElementById(id); if (inputField != null && inputField.value.length != 0){ if (inputField.createTextRange){ var FieldRange = inputField.createTextRange(); FieldRange.moveStart('character',inputField.value.length); FieldRange.collapse(); FieldRange.select(); }else if (inputField.selectionStart || inputField.selectionStart == '0') { var elemLen = inputField.value.length; inputField.selectionStart = elemLen; inputField.selectionEnd = elemLen; inputField.focus(); } }else{ inputField.focus(); } } $('#urlCompany').focus(focusCampo('urlCompany')); 

works for all ie browsers..

Comments

1

Here is another one, a one liner which does not reassign the value:

$("#inp").focus()[0].setSelectionRange(99999, 99999); 

Comments

0
function CurFocus() { $('.txtEmail').focus(); } function pageLoad() { setTimeout(CurFocus(),3000); } window.onload = pageLoad; 

Comments

0

The answer from scorpion9 works. Just to make it more clear see my code below,

<script src="~/js/jquery.js"></script> <script type="text/javascript"> $(function () { var input = $("#SomeId"); input.focus(); var tmpStr = input.val(); input.val(''); input.val(tmpStr); }); </script> 

Comments

0
 var prevInputVal = $('#input_id').val(); $('#input_id').val('').focus().val(prevInputVal) 

Store input previous value in a variable -> empty input value -> focus input -> reassign original value SIMPLE !

Comments

-4

It will focus with mouse point

$("#TextBox").focus();

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.