jquery как поймать клавишу ввода и изменить событие на вкладку
Я хочу решение jquery, я должен быть рядом, что нужно сделать?
$('html').bind('keypress', function(e)
{
if(e.keyCode == 13)
{
return e.keyCode = 9; //set event key to tab
}
});
Я могу вернуть false, и это предотвращает нажатие клавиши enter, я думал, что могу просто изменить код ключа на 9, чтобы сделать его вкладкой, но он не работает. Я должен быть рядом, что происходит?
18 ответов:
$('input').on("keypress", function(e) { /* ENTER PRESSED*/ if (e.keyCode == 13) { /* FOCUS ELEMENT */ var inputs = $(this).parents("form").eq(0).find(":input"); var idx = inputs.index(this); if (idx == inputs.length - 1) { inputs[0].select() } else { inputs[idx + 1].focus(); // handles submit buttons inputs[idx + 1].select(); } return false; } });
это работает прекрасно!
$('input').keydown( function(e) { var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; if(key == 13) { e.preventDefault(); var inputs = $(this).closest('form').find(':input:visible'); inputs.eq( inputs.index(this)+ 1 ).focus(); } });
почему бы не что-то простое, как это?
$(document).on('keypress', 'input', function(e) { if(e.keyCode == 13 && e.target.type !== 'submit') { e.preventDefault(); return $(e.target).blur().focus(); } });таким образом, вы не запускаете submit, если вы не сосредоточены на типе ввода "submit" уже, и это ставит вас прямо там, где вы остановились. Это также заставляет его работать для входов, которые динамически добавляются на страницу.
Примечание: размытие () находится перед фокусом () для всех, кто может иметь какие-либо слушатели событий "on blur". Это не обязательно для того, чтобы процесс работал.
PlusAsTab: плагин jQuery для использования клавиши numpad plus в качестве эквивалента клавиши tab.
PlusAsTab также настраивается для использования клавиши enter, как в этом демо. Смотрите некоторые из моихстарые ответына этот вопрос.
в вашем случае, заменив клавишу enter на функцию tab для всей страницы (после установки клавиши enter в качестве вкладки в настройках).
<body data-plus-as-tab="true"> ... </body>
построение из плагина Бена эта версия обрабатывает выбор, и вы можете передать опцию allowSubmit. то есть.
$("#form").enterAsTab({ 'allowSubmit': true});Это позволит enter отправить форму, если кнопка Отправить обрабатывает событие.(function( $ ){ $.fn.enterAsTab = function( options ) { var settings = $.extend( { 'allowSubmit': false }, options); this.find('input, select').live("keypress", {localSettings: settings}, function(event) { if (settings.allowSubmit) { var type = $(this).attr("type"); if (type == "submit") { return true; } } if (event.keyCode == 13 ) { var inputs = $(this).parents("form").eq(0).find(":input:visible:not(disabled):not([readonly])"); var idx = inputs.index(this); if (idx == inputs.length - 1) { idx = -1; } else { inputs[idx + 1].focus(); // handles submit buttons } try { inputs[idx + 1].select(); } catch(err) { // handle objects not offering select } return false; } }); return this; }; })( jQuery );
это наконец-то, что работает для меня идеально. Я использую jqeasyui и он работает нормально
$(document).on('keyup', 'input', function(e) { if(e.keyCode == 13 && e.target.type !== 'submit') { var inputs = $(e.target).parents("form").eq(0).find(":input:visible"), idx = inputs.index(e.target); if (idx == inputs.length - 1) { inputs[0].select() } else { inputs[idx + 1].focus(); inputs[idx + 1].select(); } } });
Я написал код из принятого ответа как плагин jQuery, который я нахожу более полезным. (кроме того, теперь он игнорирует скрытые, отключенные и только для чтения элементы формы).
$.fn.enterAsTab = function () { $(this).find('input').live("keypress", function(e) { /* ENTER PRESSED*/ if (e.keyCode == 13) { /* FOCUS ELEMENT */ var inputs = $(this).parents("form").eq(0).find(":input:visible:not(disabled):not([readonly])"), idx = inputs.index(this); if (idx == inputs.length - 1) { inputs[0].select() } else { inputs[idx + 1].focus(); // handles submit buttons inputs[idx + 1].select(); } return false; } }); return this; };таким образом, я могу сделать $('#form-id').enterAsTab (); ... Решил, что я опубликую, так как никто еще не опубликовал его как плагин$, и они не совсем интуитивно понятны для написания.
включает в себя все типы входов
$(':input').keydown(function (e) { var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; if (key == 13) { e.preventDefault(); var inputs = $(this).closest('form').find(':input:visible:enabled'); if ((inputs.length-1) == inputs.index(this)) $(':input:enabled:visible:first').focus(); else inputs.eq(inputs.index(this) + 1).focus(); } });
Это мое решение, обратная связь приветствуется.. :)
$('input').keydown( function (event) { //event==Keyevent if(event.which == 13) { var inputs = $(this).closest('form').find(':input:visible'); inputs.eq( inputs.index(this)+ 1 ).focus(); event.preventDefault(); //Disable standard Enterkey action } // event.preventDefault(); <- Disable all keys action });
вот что я использую:
$("[tabindex]").addClass("TabOnEnter"); $(document).on("keypress", ".TabOnEnter", function (e) { //Only do something when the user presses enter if (e.keyCode == 13) { var nextElement = $('[tabindex="' + (this.tabIndex + 1) + '"]'); console.log(this, nextElement); if (nextElement.length) nextElement.focus() else $('[tabindex="1"]').focus(); } });обращает внимание на tabindex и относится не только к форме, но на всю страницу.
Примечание
liveбыл устаревшим jQuery, теперь вы должны использоватьon
Я взял лучшее из вышеперечисленных и добавлена возможность работы с любого входа, за пределами форм и т. д. Кроме того, он правильно петли назад, чтобы начать сейчас, если вы достигнете последнего входа. И в случае только одного входа он размывается, а затем перефокусирует один вход, чтобы вызвать любые внешние обработчики размытия/фокусировки.
$('input,select').keydown( function(e) { var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; if(key == 13) { e.preventDefault(); var inputs = $('#content').find(':input:visible'); var nextinput = 0; if (inputs.index(this) < (inputs.length-1)) { nextinput = inputs.index(this)+1; } if (inputs.length==1) { $(this).blur().focus(); } else { inputs.eq(nextinput).focus(); } } });
эти решения не работали с моим datagrid. Я надеялся, что так и будет. Мне действительно не нужно Tab или Enter, чтобы перейти к следующему входу, столбцу, строке или чему-то еще. Мне просто нужно Войти, чтобы вызвать .focusout или .измените и мой datagrid обновит базу данных. Поэтому я добавил класс "enter" к соответствующим текстовым вводам, и это сделало трюк для меня:
$(function() { if ($.browser.mozilla) { $(".enter").keypress(checkForEnter); } else { $(".enter").keydown(checkForEnter); } }); function checkForEnter(event) { if (event.keyCode == 13) { $(".enter").blur(); } }
$('input').live("keypress", function(e) { /* ENTER PRESSED*/ if (e.keyCode == 13) { /* FOCUS ELEMENT */ var inputs = $(this).parents("form").eq(0).find(":input:visible"); var idx = inputs.index(this); if (idx == inputs.length - 1) { inputs[0].select() } else { inputs[idx + 1].focus(); // handles submit buttons inputs[idx + 1].select(); } return false; } });видимый вход не может быть сфокусирован.
doc.on('keydown', 'input', function(e, ui) { if(e.keyCode === 13){ e.preventDefault(); $(this).nextAll('input:visible').eq(0).focus(); } });это, кажется, получить работу в нескольких строках, как по-человечески возможно.
вы должны фильтровать все отключенные и только для чтения элементы. я думаю, что этот код не должен покрывать кнопки
$('body').on('keydown', 'input, select, textarea', function(e) { var self = $(this), form = self.parents('form:eq(0)'), submit = (self.attr('type') == 'submit' || self.attr('type') == 'button'), focusable, next; if (e.keyCode == 13 && !submit) { focusable = form.find('input,a,select,button,textarea').filter(':visible:not([readonly]):not([disabled])'); next = focusable.eq(focusable.index(this)+1); if (next.length) { next.focus(); } else { form.submit(); } return false; } });
У меня было такое же требование в моей разработке, поэтому я провел исследование по этому вопросу. Я прочитал много статей и попробовал много решений в течение последних двух дней, таких как jQuery.плагин tabNext ().
У меня были некоторые проблемы с IE11 (все версии IE имеет эту ошибку). При вводе текста с последующим нетекстовым вводом выделение не было очищено. Поэтому я создал свой собственный метод tabNext (), основанный на предложении решения @Sarfraz. Я также думал о том, как он должен себя вести (только круг в текущей форме или может быть, через полный документ). Я все еще не заботился о свойстве tabindex в основном потому, что я использую его время от времени. Но я этого не забуду.
для того, чтобы мой вклад может быть полезен для всех легко я создал jsfiddle пример здесь https://jsfiddle.net/mkrivan/hohx4nes/
Я включаю также JavaScript часть примера здесь:
function clearSelection() { if (document.getSelection) { // for all new browsers (IE9+, Chrome, Firefox) document.getSelection().removeAllRanges(); document.getSelection().addRange(document.createRange()); console.log("document.getSelection"); } else if (window.getSelection) { // equals with the document.getSelection (MSDN info) if (window.getSelection().removeAllRanges) { // for all new browsers (IE9+, Chrome, Firefox) window.getSelection().removeAllRanges(); window.getSelection().addRange(document.createRange()); console.log("window.getSelection.removeAllRanges"); } else if (window.getSelection().empty) { // maybe for old Chrome window.getSelection().empty(); console.log("window.getSelection.empty"); } } else if (document.selection) { // IE8- deprecated document.selection.empty(); console.log("document.selection.empty"); } } function focusNextInputElement(node) { // instead of jQuery.tabNext(); // TODO: take the tabindex into account if defined if (node !== null) { // stay in the current form var inputs = $(node).parents("form").eq(0).find(":input:visible:not([disabled]):not([readonly])"); // if you want through the full document (as TAB key is working) // var inputs = $(document).find(":input:visible:not([disabled]):not([readonly])"); var idx = inputs.index(node) + 1; // next input element index if (idx === inputs.length) { // at the end start with the first one idx = 0; } var nextInputElement = inputs[idx]; nextInputElement.focus(); // handles submit buttons try { // if next input element does not support select() nextInputElement.select(); } catch (e) { } } } function tabNext() { var currentActiveNode = document.activeElement; clearSelection(); focusNextInputElement(currentActiveNode); } function stopReturnKey(e) { var e = (e) ? e : ((event) ? event : null); if (e !== null) { var node = (e.target) ? e.target : ((e.srcElement) ? e.srcElement : null); if (node !== null) { var requiredNode = $(node).is(':input') // && !$(node).is(':input[button]') // && !$(node).is(':input[type="submit"]') && !$(node).is('textarea'); // console.log('event key code ' + e.keyCode + '; required node ' + requiredNode); if ((e.keyCode === 13) && requiredNode) { try { tabNext(); // clearSelection(); // focusNextInputElement(node); // jQuery.tabNext(); console.log("success"); } catch (e) { console.log("error"); } return false; } } } } document.onkeydown = stopReturnKey;Я оставил комментированные строки, так что мое мышление можно проследить.
Я знаю, что это довольно старый, но я искал тот же ответ и обнаружил, что выбранное решение не подчиняется tabIndex. Поэтому я изменил его следующим образом, который работает для меня. Обратите внимание, что maxTabNumber-это глобальная переменная, которая содержит максимальное количество полей ввода табуляции
$('input').on("keypress", function (e) { if (e.keyCode == 13) { var inputs = $(this).parents("form").eq(0).find(":input"); var idx = inputs.index(this); var tabIndex = parseInt($(this).attr("tabindex")); tabIndex = (tabIndex + 1) % (maxTabNumber + 1); if (tabIndex == 0) { tabIndex = 1; } $('[tabindex=' + tabIndex + ']').focus(); $('[tabindex=' + tabIndex + ']').select(); return false; } });
Если вы используете IE, это отлично сработало для меня:
<body onkeydown="tabOnEnter()"> <script type="text/javascript"> //prevents the enter key from submitting the form, instead it tabs to the next field function tabOnEnter() { if (event.keyCode==13) { event.keyCode=9; return event.keyCode } } </script>
Comments