Enter key press behaves like a Tab in Javascript

后端 未结 22 1148
说谎
说谎 2020-11-27 10:52

I\'m looking to create a form where pressing the enter key causes focus to go to the \"next\" form element on the page. The solution I keep finding on the web is...

相关标签:
22条回答
  • 2020-11-27 11:22

    I used the logic suggested by Andrew which is very effective. And this is my version:

    $('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's keycode (i.e: e.keycode) depreciation notice :- https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

    0 讨论(0)
  • 2020-11-27 11:24

    I've had a similar problem, where I wanted to press + on the numpad to tab to the next field. Now I've released a library that I think will help you.

    PlusAsTab: A jQuery plugin to use the numpad plus key as a tab key equivalent.

    Since you want enter/ instead, you can set the options. Find out which key you want to use with the jQuery event.which demo.

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

    You can try it out yourself in the PlusAsTab enter as tab demo.

    0 讨论(0)
  • 2020-11-27 11:29

    Thank you for the good script.

    I have just added the shift event on the above function to go back between elements, I thought someone may need this.

    $('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;
    }
    });
    
    0 讨论(0)
  • 2020-11-27 11:29

    I reworked the OPs solution into a Knockout binding and thought I'd share it. Thanks very much :-)

    Here's a Fiddle

    <!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>
    
    0 讨论(0)
  • 2020-11-27 11:30

    Easiest way to solve this problem with the focus function of JavaScript as follows:

    You can copy and try it @ home!

    <!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>
    
    0 讨论(0)
  • 2020-11-27 11:32

    This worked for me:

    $(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();
        }
    
    });
    
    0 讨论(0)
提交回复
热议问题