How do I move focus to next input with jQuery?

JavascriptJqueryAutocomplete

Javascript Problem Overview


I am using the autocomplete plugin with jQuery and it is working fine. However, in IE, when the user selects an item in the autocomplete, the focus does not then move to the next input field. Naturally it works in Firefox. The plugin doesn't have a built-in solution but does provide for "options". Is there a way I can force it to move to the next input field?

Javascript Solutions


Solution 1 - Javascript

You can do something like this:

$("input").change(function() {
  var inputs = $(this).closest('form').find(':input');
  inputs.eq( inputs.index(this)+ 1 ).focus();
});

The other answers posted here may not work for you since they depend on the next input being the very next sibling element, which often isn't the case. This approach goes up to the form and searches for the next input type element.

Solution 2 - Javascript

JQuery UI already has this, in my example below I included a maxchar attribute to focus on the next focus-able element (input, select, textarea, button and object) if i typed in the max number of characters

HTML:

text 1 <input type="text" value="" id="txt1" maxchar="5" /><br />
text 2 <input type="text" value="" id="txt2" maxchar="5" /><br />
checkbox 1 <input type="checkbox" value="" id="chk1" /><br />
checkbox 2 <input type="checkbox" value="" id="chk2" /><br />
dropdown 1 <select id="dd1" >
    <option value="1">1</option>
    <option value="1">2</option>
</select><br />
dropdown 2 <select id="dd2">
    <option value="1">1</option>
    <option value="1">2</option>
</select>

Javascript:

$(function() {
    var focusables = $(":focusable");   
    focusables.keyup(function(e) {
        var maxchar = false;
        if ($(this).attr("maxchar")) {
            if ($(this).val().length >= $(this).attr("maxchar"))
                maxchar = true;
            }
        if (e.keyCode == 13 || maxchar) {
            var current = focusables.index(this),
                next = focusables.eq(current+1).length ? focusables.eq(current+1) : focusables.eq(0);
            next.focus();
        }
    });
});

Solution 3 - Javascript

What Sam meant was :

$('#myInput').focus(function(){
    $(this).next('input').focus();
})

Solution 4 - Javascript

Try using something like:

var inputs = $(this).closest('form').find(':focusable');
inputs.eq(inputs.index(this) + 1).focus();

Solution 5 - Javascript

why not simply just give the input field where you want to jump to a id and do a simple focus

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

Solution 6 - Javascript

Use eq to get to specific element.

Documentation about index

$("input").keyup(function () {
   var index = $(this).index("input");		 	
   $("input").eq(index + 1).focus(); 
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<input type="text" maxlength="1"  />
<input type="text" maxlength="1"  />

<input type="text" maxlength="1"  />

<input type="text" maxlength="1"  />
<input type="text" maxlength="1"  />
<input type="text" maxlength="1"  />

Solution 7 - Javascript

Could you post some of your HTML as an example?

In the mean-time, try this:

$('#myInput').result(function(){
    $(this).next('input').focus();
})

That's untested, so it'll probably need some tweaking.

Solution 8 - Javascript

I just wrote a jQuery plugin that does what you are looking for (annoyed that that I couldn't find andy solution myself (tabStop -> http://plugins.jquery.com/tabstop/)

Solution 9 - Javascript

  function nextFormInput() {
      var focused = $(':focus');
      var inputs = $(focused).closest('form').find(':input');
      inputs.eq(inputs.index(focused) + 1).focus();
  }

Solution 10 - Javascript

you can use

$(document).on("keypress","input,select",function (e) {
    e.preventDefault();
    if (e.keyCode==13) {
        $(':input).eq($(':input').index(this) + 1)').focus();
    }
});

Solution 11 - Javascript

if you are using event.preventDefault() in your script then comment it out because IE doesn't likes it.

Solution 12 - Javascript

The easiest way is to remove it from the tab index all together:

$('#control').find('input[readonly]').each(function () {
	$(this).attr('tabindex', '-1');
});

I already use this on a couple of forms.

Solution 13 - Javascript

Here is what worked in my case. Might be less performance intensive.

$('#myelement').siblings('input').first().focus();

Solution 14 - Javascript

var inputs = $('input, select, textarea').keypress(function (e) {
  if (e.which == 13) {
    e.preventDefault();
    var nextInput = inputs.get(inputs.index(this) + 1);
    if (nextInput) {
      nextInput.focus();
    }
  }
});

Solution 15 - Javascript

onchange="$('select')[$('select').index(this)+1].focus()"

This may work if your next field is another select.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMattView Question on Stackoverflow
Solution 1 - JavascriptNick CraverView Answer on Stackoverflow
Solution 2 - JavascriptLambert AntonioView Answer on Stackoverflow
Solution 3 - JavascriptantView Answer on Stackoverflow
Solution 4 - JavascriptbussaView Answer on Stackoverflow
Solution 5 - JavascriptmindmywebView Answer on Stackoverflow
Solution 6 - JavascripttemoView Answer on Stackoverflow
Solution 7 - JavascriptSamView Answer on Stackoverflow
Solution 8 - JavascriptHoffmannView Answer on Stackoverflow
Solution 9 - JavascriptAditya MittalView Answer on Stackoverflow
Solution 10 - JavascriptNASSER KHANZADIView Answer on Stackoverflow
Solution 11 - Javascriptanuj pradhanView Answer on Stackoverflow
Solution 12 - Javascriptjfreak53View Answer on Stackoverflow
Solution 13 - JavascriptRyanView Answer on Stackoverflow
Solution 14 - JavascriptjoplaView Answer on Stackoverflow
Solution 15 - JavascriptDayan LemosView Answer on Stackoverflow