Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
97
rated 0 times [  104] [ 7]  / answers: 1 / hits: 97569  / 10 Years ago, fri, june 13, 2014, 12:00:00

Can you please tell me how to move focus on to the next field when the enter key is press? I use the dform plugin (which converts JSON to a form).



I Googled it, but this not working. Why doesn't my focus move on to the next field?



JSFiddle: http://jsfiddle.net/5WkVW/1/





$(document).keypress(function(e) {
if(e.which == 13) {

// Do something here if the popup is open
alert(dd)
var index = $('.ui-dform-text').index(this) + 1;
$('.ui-dform-text').eq(index).focus();

}
});

<script src=https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.0/jquery.min.js></script>
<form id=testSuiteConfigurationform name=testSuiteConfigurationform method=post class=ui-dform-form novalidate=novalidate>
<label class=ui-dform-label>
<h3>Configuration Parameters</h3>
</label>
<div class=ui-dform-div inputDiv>
<fieldset class=ui-dform-fieldset>
<input type=text id=totalRetryCount name=totalRetryCount tabindex=1 onblur=validateElement('Configuration', 'testSuiteConfigurationform','totalRetryCount') class=ui-dform-text valid>
<legend class=ui-dform-legend>Total Retry Count</legend>
<label for=totalRetryCount class=checked>✔</label>
</fieldset>
<fieldset class=ui-dform-fieldset>
<input type=text id=totalRepeatCount name=totalRepeatCount tabindex=2 onblur=validateElement('Configuration', 'testSuiteConfigurationform','totalRepeatCount') class=ui-dform-text>
<legend class=ui-dform-legend>Total Repeat Count</legend>
</fieldset>
<fieldset class=ui-dform-fieldset>
<select id=summaryReportRequired name=summaryReportRequired tabindex=3 onblur=validateElement('Configuration', 'testSuiteConfigurationform','summaryReportRequired') class=ui-dform-select>
<option class=ui-dform-option value=true>true</option>
<option class=ui-dform-option value=false>false</option>
</select>
<legend class=ui-dform-legend>Summary Report Required</legend>
</fieldset>
<fieldset class=ui-dform-fieldset>
<select id=postConditionExecution name=postConditionExecution tabindex=4 onblur=validateElement('Configuration', 'testSuiteConfigurationform','postConditionExecution') class=ui-dform-select>
<option class=ui-dform-option value=ALWAYS>ALWAYS</option>
<option class=ui-dform-option value=ON_SUCCESS>ON_SUCCESS</option>
</select>
<legend class=ui-dform-legend>Post Condition Execution</legend>
</fieldset>
</div>
</form>





*Note (from comments): It also needs to work on pages that do not have tabindex values set


More From » jquery

 Answers
15

It fails because this is the document in your code.



You want to use the index of the currently focused item (document.activeElement), or if you use delegated events you can make sure this is the current item.



This final version works whether there are tabindexes or not. It also wraps around:



JSFiddle 1: http://jsfiddle.net/TrueBlueAussie/5WkVW/11/



JSFiddle 2: http://jsfiddle.net/TrueBlueAussie/5WkVW/12/



They both use a custom jQuery selector that I add called :focusable to select all focusable element (including links):



// register jQuery extension
jQuery.extend(jQuery.expr[':'], {
focusable: function (el, index, selector) {
return $(el).is('a, button, :input, [tabindex]');
}
});

$(document).on('keypress', 'input,select', function (e) {
if (e.which == 13) {
e.preventDefault();
// Get all focusable elements on the page
var $canfocus = $(':focusable');
var index = $canfocus.index(this) + 1;
if (index >= $canfocus.length) index = 0;
$canfocus.eq(index).focus();
}
});


You can use the same custom selector in the event handler if you like. Then it will even work on anchor links (if you change the event to keydown instead of keypress):



e.g.



$(document).on('keydown', ':focusable', function (e) {


Example with link: http://jsfiddle.net/5WkVW/15/



This also uses a delegated on, listening for the keydown event on the document. It then applies the jQuery selector, it then applies the function to any matching element that caused the event. This is much more efficient as it only applies the selector at event time (rather than apply multiple event handler to each DOM matching element).






Old versions below:



JSFiddle: http://jsfiddle.net/TrueBlueAussie/5WkVW/3/



$(document).keypress(function(e) {
if(e.which == 13) {

// Do something here if the popup is open
//alert(dd)
var index = $('.ui-dform-text').index(document.activeElement) + 1;
$('.ui-dform-text').eq(index).focus();

}
});


*Note: alerts can interfere with focus, so use console.log for output like that and view in most browser's debug window (like Chrome's F12 debugging tools).



Update: http://jsfiddle.net/TrueBlueAussie/5WkVW/4/



This one wraps back to the first item from the last and also works on selects (the default behavior is blocked, so you can only use space to open or up/down to select options.



$('input,select').on('keypress', function (e) {
if (e.which == 13) {
e.preventDefault();
var $next = $('[tabIndex=' + (+this.tabIndex + 1) + ']');
console.log($next.length);
if (!$next.length) {
$next = $('[tabIndex=1]');
}
$next.focus();
}
});


Requested document version: http://jsfiddle.net/TrueBlueAussie/5WkVW/5/



$(document).on('keypress', 'input,select', function (e) {
if (e.which == 13) {
e.preventDefault();
var $next = $('[tabIndex=' + (+this.tabIndex + 1) + ']');
console.log($next.length);
if (!$next.length) {
$next = $('[tabIndex=1]');
}
$next.focus();
}
});

[#70582] Wednesday, June 11, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
agustindejonm

Total Points: 738
Total Questions: 84
Total Answers: 84

Location: Northern Ireland
Member since Mon, Nov 14, 2022
2 Years ago
agustindejonm questions
Fri, Jun 25, 21, 00:00, 3 Years ago
Fri, Sep 18, 20, 00:00, 4 Years ago
Sat, May 16, 20, 00:00, 4 Years ago
;