Enter key press behaves like a Tab in Javascript

后端 未结 22 1295
说谎
说谎 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:39

    Here is an angular.js directive to make enter go to the next field using the other answers as inspiration. There is some, perhaps, odd looking code here because I only use the jQlite packaged with angular. I believe most of the features here work in all browsers > 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
        };
    });
    

    Here's how I use it in the app I'm working on, by just adding the pdk-next-input-on-enter directive on an element. I am using a barcode scanner to enter data into fields, the default function of the scanner is to emulate a keayboard, injecting an enter key after typing the data of the scanned barcode.

    There is one side-effect to this code (a positive one for my use-case), if it moves focus onto a button, the enter keyup event will cause the button's action to be activated. This worked really well for my flow as the last form element in my markup is a button that I want activated once all the fields have been "tabbed" through by scanning barcodes.

    
    
      
          
          
      
      
          

    {{labelDocument.SerialNumber}}

    Component Serials
    • {{serial.name}}

提交回复
热议问题