How to advance to the next form input when the current input has a value?

前端 未结 10 1377
傲寒
傲寒 2020-11-30 04:08

I am having a form with lots of entries. I would like to change my focus to the next textbox, once I entered the value in the current textbox. and want to continue this proc

相关标签:
10条回答
  • 2020-11-30 04:25

    This simulates a tab through a form and gives focus to the next input when the enter key is pressed.

    window.onkeypress = function(e) {
        if (e.which == 13) {
            e.preventDefault();
            var inputs = document.getElementsByClassName('input');
            for (var i = 0; i < inputs.length; i++) {
            if (document.activeElement.id == inputs[i].id && i+1 < inputs.length ) {
                inputs[i+1].focus();
                break;   
            }
        }
    
    0 讨论(0)
  • 2020-11-30 04:26
    function nextField(current){
        for (i = 0; i < current.form.elements.length; i++){
            if (current.form.elements[i].tabIndex - current.tabIndex == 1){
                current.form.elements[i].focus();
                if (current.form.elements[i].type == "text"){
                    current.form.elements[i].select();
                }
            }
        }
    }
    

    This, when supplied with the current field, will jump focus to the field with the next tab index. Usage would be as follows

    <input type="text" onEvent="nextField(this);" />
    
    0 讨论(0)
  • 2020-11-30 04:28

    I couldn't find an answer that could do what I wanted. I had a problem where there were some link elements that I didn't want users tabbing to. This is what I came up with:

    (Note that in my own code I used a:not(.dropdown-item) instead of a on the allElements line, in order to prevent users tabbing to a.dropdown-item.)

    function(event){
            //Note that this doesn't honour tab-indexes
    
            event.preventDefault();
    
            //Isolate the node that we're after
            const currentNode = event.target;
    
            //find all tab-able elements
            const allElements = document.querySelectorAll('input, button, a, area, object, select, textarea, [contenteditable]');
    
            //Find the current tab index.
            const currentIndex = [...allElements].findIndex(el => currentNode.isEqualNode(el))
    
            //focus the following element
            const targetIndex = (currentIndex + 1) % allElements.length;
            allElements[targetIndex].focus();
    }
    
    0 讨论(0)
  • 2020-11-30 04:31

    This should work. Working with and without tabindex.

    var currentlyFocused = undefined;
    var tabableElements = undefined;
    
    /**
     * Compare function for element sort
     * @param {string | null} a
     * @param {string | null} b
     * @param {boolean} asc
     */
    function sortCompare(a, b, asc = true) {
      let result = null;
      if (a == null) result = 1;
      else if (b == null) result = -1;
      else if (parseInt(a) > parseInt(b)) result = 1;
      else if (parseInt(a) < parseInt(b)) result = -1;
      else result = 0;
      return result * (asc ? 1 : -1);
    }
    
    /**
     * When an element is focused assign it to the currentlyFocused variable
     * @param {Element} element
     */
    function registerOnElementFocus(element) {
      element.addEventListener("focus", function(el) {
        currentlyFocused = el.srcElement;
      });
    }
    
    /**
     * Tab Trigger
     */
    function onTabClick() {
      //Select currently focused element
      let currentIndex;
      tabableElements.forEach((el, idx) => {
        //return if no element is focused
        if (!currentlyFocused) return;
        if (currentlyFocused.isEqualNode(el)) {
          //assign current index and return
          currentIndex = idx;
          return;
        }
      });
      //if theres no focused element or the current focused element is last start over
      let lastIndex = tabableElements.length - 1;
      let nextElementidx = currentIndex === undefined || currentIndex == lastIndex ? 0 : currentIndex + 1;
      //Focus
      currentlyFocused = tabableElements[nextElementidx];
      currentlyFocused.focus();
    }
    /**
     * Init must be run after all elements are loadead in the dom
     */
    function init() {
      //Get all tab-able elements
      let nodeList = document.querySelectorAll("input, button, a, area, object, select, textarea, [tabindex]");
      //To array for easier manipulation
      tabableElements = Array.prototype.slice.call(nodeList, 0);
      //Correcting tabindexes to ensure correct order
      tabableElements.forEach((el, idx, list) => {
        let tabindex = el.getAttribute("tabindex");
        //-1 tabindex will not receive focus
        if (tabindex == -1) list.splice(idx, 1);
        //null or 0 tabindex in normal source order
        else if (tabindex == null || tabindex == 0) {
          list[idx].setAttribute("tabindex", 9999 + idx);
        }
      });
      //sort elements by their tabindex in ascending order
      tabableElements.sort((elementA, elementB) => sortCompare(elementA.getAttribute("tabindex"), elementB.getAttribute("tabindex")));
      //register focus event to elements
      tabableElements.forEach(el => registerOnElementFocus(el));
    }
    <!doctype html>
    <html lang="en">
    
    <head>
      <!-- Required meta tags -->
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    
      <!-- Bootstrap CSS -->
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    
      <title>Virtual tab</title>
    </head>
    
    <body onload="init()">
      <div class="container">
        <h3>Virtual Tab Demo</h3>
        <form>
          <div class="btn btn-primary" style="position: fixed;" onclick="onTabClick()">
            Tab!
          </div>
          <br>
          <br>
          <button id="button1" type="button" onclick="alert('button 1')">Button1</button>
          <button id="button2" type="button" onclick="alert('button 2')">Button2</button>
          <br>
          <br>
          <input id="text" type='text'>text
          <br>
          <input id="password" type='password' tabindex="-1">password
          <br>
          <input id="number" type='number' tabindex="5">number
          <br>
          <input id="checkbox" type='checkbox'>checkbox
          <br>
          <input id="radio" type='radio'>radio
          <br>
          <br>
          <button id="button3" type="button" onclick="alert('button 3')">Button3</button>
          <button id="button4" type="button" onclick="alert('button 4')">Button4</button>
          <br>
          <br>
          <select id="select">
            <option value="volvo">Volvo</option>
            <option value="saab">Saab</option>
            <option value="mercedes">Mercedes</option>
            <option value="audi">Audi</option>
          </select>
          <br>
          <br> textarea
          <br>
          <textarea id="textarea"></textarea>
            <br>
            <br>
            <span id="span" tabindex="1">Focus other elements.</span>
        </form>
      </div>
      <!-- Optional JavaScript -->
      <!-- jQuery first, then Popper.js, then Bootstrap JS -->
      <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    </body>
    
    </html>

    0 讨论(0)
提交回复
热议问题