Enter键的行为类似于Javascript中的Tab


77

我正在寻找一种创建表单的方法,按Enter键可使焦点移至页面上的“下一个”表单元素。我一直在网上找到的解决方案是...

 <body onkeydown="if(event.keyCode==13){event.keyCode=9; return event.keyCode}">

不幸的是,这似乎仅在IE中有效。因此,这个问题的实质是,是否有人知道适用于FF和Chrome的解决方案?另外,我宁愿不必将onkeydown事件添加到表单元素本身,但是如果那是唯一的方法,则必须这样做。

这个问题与问题905222相似,但在我看来,这是一个自己的问题。

编辑:另外,我已经看到人们提出了这样的问题,即这不是好样式,因为它与用户习惯的表单行为不同。我同意!这是客户的要求:(

Answers:


90

我使用了安德鲁建议的非常有效的逻辑。这是我的版本:

$('body').on('keydown', 'input, select', function(e) {
    if (e.key === "Enter") {
        var self = $(this), form = self.parents('form:eq(0)'), focusable, next;
        focusable = form.find('input,a,select,button,textarea').filter(':visible');
        next = focusable.eq(focusable.index(this)+1);
        if (next.length) {
            next.focus();
        } else {
            form.submit();
        }
        return false;
    }
});

KeyboardEvent的键码(即:)e.keycode折旧通知:-https : //developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/keyCode


28
我建议textarea从第一行的选择器中删除。在文本区域中,您希望能够使用Enter键开始新行。
aimfeld

2
我建议使用readonly和忽略字段disabledfilter(':visible:not([readonly]):enabled')
SnakeDrak '16

为什么在这里使用“自我”变量?
Spikolynn '16

1
我知道这是一个非常老的线程,但是有了这段代码,我们如何允许<input type =“ button” />的默认行为?如何允许使用Enter键单击按钮?
Vishal_Kotecha

18

我想到的最简单的香草JS代码段:

document.addEventListener('keydown', function (event) {
  if (event.keyCode === 13 && event.target.nodeName === 'INPUT') {
    var form = event.target.form;
    var index = Array.prototype.indexOf.call(form, event.target);
    form.elements[index + 1].focus();
    event.preventDefault();
  }
});

可在IE 9+和现代浏览器中使用。


2
我相信这应该是正确的答案。OP不要求使用jquery,这要简单得多且兼容得多。
蓝色的水,

1
不知道为什么这么多的答案都假定存在某种形式...这不起作用:Uncaught TypeError: Array.prototype.indexOf called on null or undefined
贾斯汀

17

将[Enter]键映射为类似于[Tab]键

我用jQuery重写了安德烈·范·祖丹Andre Van Zuydam)的答案,该答案对我不起作用。这同时捕获了EnterShift+ EnterEnter标签向前,而Shift+Enter标签向后。

我还重写了self当前焦点项目初始化的方式。表单也是以这种方式选择的。这是代码:

// Map [Enter] key to work like the [Tab] key
// Daniel P. Clark 2014

// Catch the keydown for the entire document
$(document).keydown(function(e) {

  // Set self as the current item in focus
  var self = $(':focus'),
      // Set the form by the current item in focus
      form = self.parents('form:eq(0)'),
      focusable;

  // Array of Indexable/Tab-able items
  focusable = form.find('input,a,select,button,textarea,div[contenteditable=true]').filter(':visible');

  function enterKey(){
    if (e.which === 13 && !self.is('textarea,div[contenteditable=true]')) { // [Enter] key

      // If not a regular hyperlink/button/textarea
      if ($.inArray(self, focusable) && (!self.is('a,button'))){
        // Then prevent the default [Enter] key behaviour from submitting the form
        e.preventDefault();
      } // Otherwise follow the link/button as by design, or put new line in textarea

      // Focus on the next item (either previous or next depending on shift)
      focusable.eq(focusable.index(self) + (e.shiftKey ? -1 : 1)).focus();

      return false;
    }
  }
  // We need to capture the [Shift] key and check the [Enter] key either way.
  if (e.shiftKey) { enterKey() } else { enterKey() }
});

原因 textarea

之所以会包含在内,是因为我们“确实”想要进入该页面。同样,一旦进入,我们就不想停止添加Enter新行的默认行为。

原因abutton

允许默认操作“”仍然关注下一个项目,因为它们并不总是加载另一个页面。诸如手风琴或标签内容之类的内容可能会有触发/效果。因此,一旦您触发了默认行为,并且页面产生了特殊的效果,您仍要转到下一项,因为您的触发器可能已经很好地介绍了它。


4
最后一点的目的是什么if (e.shiftKey) { enterKey() } else { enterKey() }?似乎应该是:enterKey()
AVProgrammer

2
@AVProgrammer要使输入选项卡一样,如果按住Shift键,则需要反向输入。您询问的行允许在按下Shift键的同时检查Enter键。
2013年

2
在这两种情况下,都没有必要检查e.shiftKey并调用enterKey。
杰普·安德烈森

@JeppeAndreasen如果您希望它的行为类似于tab,则可以。因为Shift + Tab的方向相反。
6英尺丹,

2
无论是否按下Shift,您都将执行相同的操作。因此,正如avprogrammer也指出的那样,if语句不是必需的
Jeppe Andreasen

12

这对我有用:

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

    if (e.key === "Enter") {
        e.preventDefault();

        var $canfocus = $(':tabbable:visible');
        var index = $canfocus.index(document.activeElement) + 1;

        if (index >= $canfocus.length) index = 0;
        $canfocus.eq(index).focus();
    }

});

似乎不起作用。小提琴链接已死(并且已删除)。
isherwood '19

这需要可选项选择器的jquery-ui
Mat Mannion

11

谢谢你的好脚本。

我刚刚在上面的函数上添加了shift事件,以在元素之间返回,我认为有人可能需要这个。

$('body').on('keydown', 'input, select, textarea', function(e) {
var self = $(this)
  , form = self.parents('form:eq(0)')
  , focusable
  , next
  , prev
  ;

if (e.shiftKey) {
 if (e.keyCode == 13) {
     focusable =   form.find('input,a,select,button,textarea').filter(':visible');
     prev = focusable.eq(focusable.index(this)-1); 

     if (prev.length) {
        prev.focus();
     } else {
        form.submit();
    }
  }
}
  else
if (e.keyCode == 13) {
    focusable = form.find('input,a,select,button,textarea').filter(':visible');
    next = focusable.eq(focusable.index(this)+1);
    if (next.length) {
        next.focus();
    } else {
        form.submit();
    }
    return false;
}
});

我赞成,因为我喜欢代码。尽管在测试中它对我没有用。因此,我写了一个有效的答案:stackoverflow.com/a/27545387/1500195
6ft Dan

e.keyCodee.which已弃用。您应该使用e.key === "Enter"。参见developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/keyCode
oriadam

6

这里给出的所有实现都有问题。有些不能在textareas和提交按钮上正常使用,大多数不允许您使用shift向后移动,如果有的话,它们都不使用tabindexes,并且它们都不是从最后到第一个或第一个到最后。

要使[enter]键的作用类似于[tab]键,但仍可正确使用文本区域和提交按钮,请使用以下代码。另外,此代码允许您使用Shift键向后移动,并且制表符从前到后和从前到后环绕。

源代码:https : //github.com/mikbe/SaneEnterKey

CoffeeScript

mbsd_sane_enter_key = ->
  input_types = "input, select, button, textarea"
  $("body").on "keydown", input_types, (e) ->
    enter_key = 13
    tab_key = 9

    if e.keyCode in [tab_key, enter_key]
      self = $(this)

      # some controls should just press enter when pressing enter
      if e.keyCode == enter_key and (self.prop('type') in ["submit", "textarea"])
        return true

      form = self.parents('form:eq(0)')

      # Sort by tab indexes if they exist
      tab_index = parseInt(self.attr('tabindex'))
      if tab_index
        input_array = form.find("[tabindex]").filter(':visible').sort((a,b) -> 
          parseInt($(a).attr('tabindex')) - parseInt($(b).attr('tabindex'))
        )
      else
        input_array = form.find(input_types).filter(':visible')

      # reverse the direction if using shift
      move_direction = if e.shiftKey then -1 else 1
      new_index = input_array.index(this) + move_direction

      # wrap around the controls
      if new_index == input_array.length
        new_index = 0
      else if new_index == -1
        new_index = input_array.length - 1

      move_to = input_array.eq(new_index)
      move_to.focus()
      move_to.select()

      false

$(window).on 'ready page:load', ->
  mbsd_sane_enter_key()

的JavaScript

var mbsd_sane_enter_key = function() {
  var input_types;
  input_types = "input, select, button, textarea";

  return $("body").on("keydown", input_types, function(e) {
    var enter_key, form, input_array, move_direction, move_to, new_index, self, tab_index, tab_key;
    enter_key = 13;
    tab_key = 9;

    if (e.keyCode === tab_key || e.keyCode === enter_key) {
      self = $(this);

      // some controls should react as designed when pressing enter
      if (e.keyCode === enter_key && (self.prop('type') === "submit" || self.prop('type') === "textarea")) {
        return true;
      }

      form = self.parents('form:eq(0)');

      // Sort by tab indexes if they exist
      tab_index = parseInt(self.attr('tabindex'));
      if (tab_index) {
        input_array = form.find("[tabindex]").filter(':visible').sort(function(a, b) {
          return parseInt($(a).attr('tabindex')) - parseInt($(b).attr('tabindex'));
        });
      } else {
        input_array = form.find(input_types).filter(':visible');
      }

      // reverse the direction if using shift
      move_direction = e.shiftKey ? -1 : 1;
      new_index = input_array.index(this) + move_direction;

      // wrap around the controls
      if (new_index === input_array.length) {
        new_index = 0;
      } else if (new_index === -1) {
        new_index = input_array.length - 1;
      }

      move_to = input_array.eq(new_index);
      move_to.focus();
      move_to.select();
      return false;
    }
  });
};

$(window).on('ready page:load', function() {
  mbsd_sane_enter_key();
}

4

与本机实现的默认行为相比,更改此行为实际上可以创建更好的用户体验。考虑到回车键的行为从用户的角度来看已经不一致,因为在单行输入中,回车倾向于提交表单,而在多行文本区域中,它只是向换行符的内容添加换行符。领域。

我最近做到了这一点(使用jQuery):

$('input.enterastab, select.enterastab, textarea.enterastab').live('keydown', function(e) {
 if (e.keyCode==13) {
  var focusable = $('input,a,select,button,textarea').filter(':visible');
  focusable.eq(focusable.index(this)+1).focus();
  return false;
 }
});

这不是非常有效,但是效果很好并且可靠-只需将“ enterastab”类添加到应以这种方式运行的任何输入元素即可。


1
简明扼要!也从类似的东西开始,但是现在我已经扩展了它-在PlusAsTab上查看我的答案(在此页面上)。
乔尔·普拉

专门在寻找可以偷走那些看不见的田地的东西。我发现的大多数其他解决方案都没有。谢谢
Simon_Weaver

4

我将OPs解决方案重新设计为Knockout绑定,并认为我会分享它。非常感谢 :-)

是小提琴

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
    <script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-2.2.1.js" type="text/javascript"></script>


</head>
<body>

    <div data-bind="nextFieldOnEnter:true">
        <input type="text" />
        <input type="text" />
        <select>
          <option value="volvo">Volvo</option>
          <option value="saab">Saab</option>
          <option value="mercedes">Mercedes</option>
          <option value="audi">Audi</option>
        </select>
        <input type="text" />
        <input type="text" />
    </div>


    <script type="text/javascript">
    ko.bindingHandlers.nextFieldOnEnter = {
        init: function(element, valueAccessor, allBindingsAccessor) {
            $(element).on('keydown', 'input, select', function (e) {
                var self = $(this)
                , form = $(element)
                  , focusable
                  , next
                ;
                if (e.keyCode == 13) {
                    focusable = form.find('input,a,select,button,textarea').filter(':visible');
                    var nextIndex = focusable.index(this) == focusable.length -1 ? 0 : focusable.index(this) + 1;
                    next = focusable.eq(nextIndex);
                    next.focus();
                    return false;
                }
            });
        }
    };

    ko.applyBindings({});
    </script>
</body>
</html>

您的解决方案正是我所要的,但有一个例外:我不希望在输入类型按钮时出现这种行为。如何排除它们?我设法将按钮定义为<button>元素,但我希望能够将其定义为<input type =“ button”>。谢谢
bzamfir 2014年

1
你好 也许尝试如下更改选择器?.... $(element).on('keydown','input:not(input [type = button]),select',函数(e){.....
Damien Sawyer 2014年

+1; 太好了,我使用了很多剔除功能,但是我需要此功能的项目是AngularJS应用。如果您不介意,我将借用您的impl代码,并使用Angular的自定义指令发布答案。
joshperry 2014年

真甜 当您熟悉自定义绑定时,它们真棒。:-)
Damien Sawyer 2014年

2

这是一个angular.js指令,可使用其他答案作为启发使enter进入下一个字段。这里有一些可能看起来很奇怪的代码,因为我只使用了与angular打包在一起的jQlite。我相信这里的大多数功能都可以在所有浏览器> IE8中使用。

angular.module('myapp', [])
.directive('pdkNextInputOnEnter', function() {
    var includeTags = ['INPUT', 'SELECT'];

    function link(scope, element, attrs) {
        element.on('keydown', function (e) {
            // Go to next form element on enter and only for included tags
            if (e.keyCode == 13 && includeTags.indexOf(e.target.tagName) != -1) {
                // Find all form elements that can receive focus
                var focusable = element[0].querySelectorAll('input,select,button,textarea');

                // Get the index of the currently focused element
                var currentIndex = Array.prototype.indexOf.call(focusable, e.target)

                // Find the next items in the list
                var nextIndex = currentIndex == focusable.length - 1 ? 0 : currentIndex + 1;

                // Focus the next element
                if(nextIndex >= 0 && nextIndex < focusable.length)
                    focusable[nextIndex].focus();

                return false;
            }
        });
    }

    return {
        restrict: 'A',
        link: link
    };
});

通过将pdk-next-input-on-enter指令添加到元素上,可以在我正在使用的应用程序中使用它。我正在使用条形码扫描仪在字段中输入数据,扫描仪的默认功能是模拟keayboard,在键入扫描的条形码的数据后注入Enter键。

该代码有一个副作用(对于我的用例而言,是一个积极的方面),如果将焦点移到按钮上,则enter keyup事件将导致激活按钮的动作。这对我的流程非常有效,因为标记中的最后一个表单元素是一个按钮,一旦通过扫描条形码“标签”了所有字段,便要激活该按钮。

<!DOCTYPE html>
<html ng-app=myapp>
  <head>
      <script src="angular.min.js"></script>
      <script src="controller.js"></script>
  </head>
  <body ng-controller="LabelPrintingController">
      <div class='.container' pdk-next-input-on-enter>
          <select ng-options="p for p in partNumbers" ng-model="selectedPart" ng-change="selectedPartChanged()"></select>
          <h2>{{labelDocument.SerialNumber}}</h2>
          <div ng-show="labelDocument.ComponentSerials">
              <b>Component Serials</b>
              <ul>
                  <li ng-repeat="serial in labelDocument.ComponentSerials">
                      {{serial.name}}<br/>
                      <input type="text" ng-model="serial.value" />
                  </li>
              </ul>
          </div>
          <button ng-click="printLabel()">Print</button>
      </div>
  </body>
</html>

1

我遇到了类似的问题,我想+在数字键盘上按一下以跳到下一个字段。现在,我发布了一个库,认为对您有帮助。

PlusAsTab:一个jQuery插件,用于将numpad加号用作Tab键。

由于需要enter/代替,因此可以设置选项。找出要与jQuery event哪个演示一起使用的键。

JoelPurra.PlusAsTab.setOptions({
  // Use enter instead of plus
  // Number 13 found through demo at
  // https://api.jquery.com/event.which/
  key: 13
});

// Matches all inputs with name "a[]" (needs some character escaping)
$('input[name=a\\[\\]]').plusAsTab();

您可以在PlusAsTab输入为标签演示中自己尝试一下。


这很有趣。但是我有一个问题:如果在页面加载后添加了更多UI元素(如将可剔除绑定与可观察数组结合使用),会发生什么情况?要使新添加的控件也处理“作为选项卡输入”,需要做些什么?谢谢
bzamfir 2014年

@bzamfir:如果它在带有的包含元素中data-plus-as-tab="true",则无需执行任何操作,否则可以运行$("#new-input").plusAsTab()。在此“改进HTML表单演示中的用户体验”中,查看动态元素和示例实现。
2014年

0

我只有JavaScript才能运作。Firefox不允许您更新keyCode,因此您所能做的就是捕获keyCode 13,并通过tabIndex强制其将焦点放在下一个元素上,就像按下keyCode 9一样。棘手的部分是找到下一个tabIndex。我仅在IE8-IE10和Firefox上对此进行了测试,并且可以正常工作:

function ModifyEnterKeyPressAsTab(event)
{
    var caller;
    var key;
    if (window.event)
    {
        caller = window.event.srcElement; //Get the event caller in IE.
        key = window.event.keyCode; //Get the keycode in IE.
    }
    else
    {
        caller = event.target; //Get the event caller in Firefox.
        key = event.which; //Get the keycode in Firefox.
    }
    if (key == 13) //Enter key was pressed.
    {
        cTab = caller.tabIndex; //caller tabIndex.
        maxTab = 0; //highest tabIndex (start at 0 to change)
        minTab = cTab; //lowest tabIndex (this may change, but start at caller)
        allById = document.getElementsByTagName("input"); //Get input elements.
        allByIndex = []; //Storage for elements by index.
        c = 0; //index of the caller in allByIndex (start at 0 to change)
        i = 0; //generic indexer for allByIndex;
        for (id in allById) //Loop through all the input elements by id.
        {
            allByIndex[i] = allById[id]; //Set allByIndex.
            tab = allByIndex[i].tabIndex;
            if (caller == allByIndex[i])
                c = i; //Get the index of the caller.
            if (tab > maxTab)
                maxTab = tab; //Get the highest tabIndex on the page.
            if (tab < minTab && tab >= 0)
                minTab = tab; //Get the lowest positive tabIndex on the page.
            i++;
        }
        //Loop through tab indexes from caller to highest.
        for (tab = cTab; tab <= maxTab; tab++)
        {
            //Look for this tabIndex from the caller to the end of page.
            for (i = c + 1; i < allByIndex.length; i++)
            {
                if (allByIndex[i].tabIndex == tab)
                {
                    allByIndex[i].focus(); //Move to that element and stop.
                    return;
                }
            }
            //Look for the next tabIndex from the start of page to the caller.
            for (i = 0; i < c; i++)
            {
                if (allByIndex[i].tabIndex == tab + 1)
                {
                    allByIndex[i].focus(); //Move to that element and stop.
                    return;
                }
            }
            //Continue searching from the caller for the next tabIndex.
        }

        //The caller was the last element with the highest tabIndex,
        //so find the first element with the lowest tabIndex.
        for (i = 0; i < allByIndex.length; i++)
        {
            if (allByIndex[i].tabIndex == minTab)
            {
                allByIndex[i].focus(); //Move to that element and stop.
                return;
            }
        }
    }
}

要使用此代码,请将其添加到您的html输入标签中:

<input id="SomeID" onkeydown="ModifyEnterKeyPressAsTab(event);" ... >

或将其添加到javascript中的元素中:

document.getElementById("SomeID").onKeyDown = ModifyEnterKeyPressAsTab;

其他一些注意事项:

我只需要它对我的输入元素起作用,但是如果需要,您可以将其扩展到其他文档元素。为此,getElementsByClassName很有帮助,但这是另一个主题。

一个限制是它只能在您添加到allById数组中的元素之间进行制表。它不会浏览浏览器可能会显示的其他内容,例如html文档外部的工具栏和菜单。也许这是功能而非限制。如果愿意,可以捕获keyCode 9,此行为也可以与Tab键一起使用。


0

您可以在下面使用经过Mozilla,IE和Chrome测试的我的代码

   // Use to act like tab using enter key
    $.fn.enterkeytab=function(){
         $(this).on('keydown', 'input, select,', function(e) {
        var self = $(this)
          , form = self.parents('form:eq(0)')
          , focusable
          , next
          ;
            if (e.keyCode == 13) {
                focusable = form.find('input,a,select,button').filter(':visible');
                next = focusable.eq(focusable.index(this)+1);
                if (next.length) {
                    next.focus();
                } else {
                    alert("wd");
                    //form.submit();
                }
                return false;
            }
        });

    }

如何使用?

$(“#form”)。enterkeytab(); //输入密钥标签


0

如果可以的话,我将重新考虑这样做:<Enter>在表单中按下时的默认操作会提交表单,而您为更改此默认操作/预期行为所做的任何操作都可能会导致网站的可用性问题。


1
通常,我会同意,但是我们的应用程序允许用户为自己的帐户分别设置类似的内容,而客户为此提供了资金,因此我认为我们无法证明自己的立场。
罗斯2009年

回车键的默认行为已经不一致。仅当您处于文本输入类型内时,它才会提交,大多数其他输入类型对于Enter键都有其自己定义的行为。只要他不将Tab键映射到其他项,这似乎比开箱即用的怪异行为好得多。
哔哔

3
我发现按Enter键进行提交是不期望的,并且实际上非常烦人。实际上,在我建立的每个网站中,客户都要求我更改此行为,因为这是不必要的。我责怪某人[咳嗽]微软[/咳嗽],面对大量不想要的证据,他们不能承认他们为这种持续行为做出了错误的选择。
Mike Bethany 2014年

0

支持Shift + Enter的Vanilla js,并能够选择可聚焦的HTML标签。应该可以使用IE9 +。

  onKeyUp(e) {
    switch (e.keyCode) {
      case 13: //Enter
        var focusableElements = document.querySelectorAll('input, button')
        var index = Array.prototype.indexOf.call(focusableElements, document.activeElement)
        if(e.shiftKey)
          focus(focusableElements, index - 1)
        else
          focus(focusableElements, index + 1)

        e.preventDefault()
        break;
    }
    function focus(elements, index) {
      if(elements[index])
        elements[index].focus()
    }
  }

0

尝试这个...

$(document).ready(function () {
    $.fn.enterkeytab = function () {
        $(this).on('keydown', 'input,select,text,button', function (e) {
            var self = $(this)
              , form = self.parents('form:eq(0)')
              , focusable
              , next
            ;
            if (e.keyCode == 13) {
                focusable = form.find('input,a,select').filter(':visible');
                next = focusable.eq(focusable.index(this) + 1);
                if (next.length) {
                    //if disable try get next 10 fields
                    if (next.is(":disabled")){
                        for(i=2;i<10;i++){
                            next = focusable.eq(focusable.index(this) + i);
                            if (!next.is(":disabled"))
                                break;
                        }
                    }
                    next.focus();
                }
                return false;
            }
        });
    }
    $("form").enterkeytab();
});

0

这是我想出的。

form.addEventListener("submit", (e) => { //On Submit
 let key = e.charCode || e.keyCode || 0 //get the key code
 if (key = 13) { //If enter key
    e.preventDefault()
    const inputs = Array.from(document.querySelectorAll("form input")) //Get array of inputs
    let nextInput = inputs[inputs.indexOf(document.activeElement) + 1] //get index of input after the current input
    nextInput.focus() //focus new input
}
}

欢迎使用堆栈溢出。目前,这个问题还有19个其他答案。如果您希望获得自己的赞誉,请考虑解释为什么它比其他的要好。
CHB

0

这里的许多答案,使用e.keyCodee.which被弃用。

相反,您应该使用e.key === 'Enter'

文档:https//developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/keyCode

  • 抱歉,我暂时无法测试这些代码段。经过测试后会回来。

使用HTML:

<body onkeypress="if(event.key==='Enter' && event.target.form){focusNextElement(event); return false;}">

使用jQuery:

$(window).on('keypress', function (ev)
{
    if (ev.key === "Enter" && ev.currentTarget.form) focusNextElement(ev)
}

而使用Vanilla JS:

document.addEventListener('keypress', function (ev) {
    if (ev.key === "Enter" && ev.currentTarget.form) focusNextElement(ev);
});

您可以focusNextElement()从此处获取功能:https//stackoverflow.com/a/35173443/3356679


0

使用JavaScript的焦点功能解决此问题的最简单方法如下:

您可以在家里复制并尝试!

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>

    <input id="input1" type="text" onkeypress="pressEnter()" />
    <input id="input2" type="text" onkeypress="pressEnter2()" />
    <input id="input3" type="text"/>

    <script type="text/javascript">
    function pressEnter() {
      // Key Code for ENTER = 13
      if ((event.keyCode == 13)) {
        document.getElementById("input2").focus({preventScroll:false});
      }
    }
    function pressEnter2() {
      if ((event.keyCode == 13)) {
        document.getElementById("input3").focus({preventScroll:false});
      }
    }
    </script>

  </body>
</html>

-1

我有一个类似的需求。这是我所做的:

  <script type="text/javascript" language="javascript">
    function convertEnterToTab() {
      if(event.keyCode==13) {
        event.keyCode = 9;
      }
    }
    document.onkeydown = convertEnterToTab;    
  </script>  

-1

在所有情况下,仅适用于Chrome和IE,我添加了以下代码来解决该问题:

var key =(window.event)?e.keyCode:e.which;

我在键码等于13时测试了键值

    $('body').on('keydown', 'input, select, textarea', function (e) {
    var self = $(this)
      , form = self.parents('form:eq(0)')
      , focusable
      , next
    ;

    var key = (window.event) ? e.keyCode : e.which;

    if (key == 13) {
        focusable = form.find('input,a,select,button,textarea').filter(':visible');
        next = focusable.eq(focusable.index(this) + 1);
        if (next.length) {
            next.focus();
        } else {
            focusable.click();
        }
        return false;
    }
});

-1
$("#form input , select , textarea").keypress(function(e){
    if(e.keyCode == 13){
        var enter_position = $(this).index();
        $("#form input , select , textarea").eq(enter_position+1).focus();
    }
});

您能否提供一些简短的代码说明,以使答案更容易理解?
卡莱斯·桑斯·富恩特斯

首先需要选择表单中的所有输入字段,然后需要在每个输入字段中绑定keypress事件,然后需要检查是否输入keypress,并且在输入字段中按Enter键时,需要获取该索引输入字段并将增量添加到它的索引中以找到下一个输入字段,当您找到下一个输入字段时,您需要关注它....!
user11706828

-2

您可以通过编程迭代添加onkeydown处理程序的表单元素。这样,您可以重用代码。


这就是我最终要做的。谢谢!
罗斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.