Convert input to tab, work with hidden fields

I have a script that converts "Enter" to "Tab" and it works fine until I delete the hidden field in the form.

So, is there a way to detect a hidden field and still use a script (in IE and firefox)?

<script type="text/javascript">
    function tabE(obj, e) {
        var e = (typeof event != 'undefined') ? window.event : e; // IE : Moz 
        if (e.keyCode == 13) {
            var ele = document.forms[0].elements;
            for (var i = 0; i < ele.length; i++) {
                var q = (i == ele.length - 1) ? 0 : i + 1; // if last element : if any other 
                if (obj == ele[i]) {
                    ele[q].focus();
                    break
                }
            }
            return false;
        }
    }
</script>
+4
source share
2 answers

Modify your code to look like this:

<script type="text/javascript">
    function tabE(obj, e) {
        var e = (typeof event != 'undefined') ? window.event : e; // IE : Moz 
        if (e.keyCode == 13) {
            var ele = document.forms[0].elements;
            for (var i = 0; i < ele.length; i++) {
                var q = (i == ele.length - 1) ? 0 : i + 1; // if last element : if any other 
                if (obj == ele[i] && $(ele[q]).is(":visible")) {
                    ele[q].focus();
                    break
                }
            }
            return false;
        }
    }
</script>

I just added a check to make sure that the element you are going to focus on is visible (not hidden).

EDIT: if you want to completely skip hidden fields, use the code below.

function tabE(obj, e) {
  var e = (typeof event != 'undefined') ? window.event : e; // IE : Moz

  var self = $(obj),
    form = self.parents('form:eq(0)'),
    focusable, next;

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

Violin:

https://jsfiddle.net/mwatz122/0zqzzmc1/

+1
source

My suggestion is filled with js:

function tabE(obj, e) {
  var e = (typeof event != 'undefined') ? window.event : e; // IE : Moz
  if (e.keyCode == 13) {
    var ele = document.forms[0].elements;
    for (var i = 0; i < ele.length; i++) {
      var q = (i == ele.length - 1) ? 0 : i + 1; // if last element : if any other
      if (obj == ele[i]) {
        var style = window.getComputedStyle(ele[q]);
        while (style.display == 'none' || style.visibility != 'visible' || ele[q].type == 'hidden') {
          q = (q == ele.length - 1) ? 0 : q + 1; // if last element : if any other
          style = window.getComputedStyle(ele[q]);
        }
        ele[q].focus();
        break
      }
    }
    return false;
  }
}
window.onload = function() {
  var inp = document.getElementsByTagName("input")
  for(i=0; i<inp.length; i++) {
    inp[i].addEventListener("keyup", function(e) {
      tabE(this, e);
    });
  }
}
<form>
    First name:<br>
    <input type="text" name="firstname">
    <br>
    Last name:<br>
    <input type="text" name="lastname">
    <input type="text" name="myhidden" style="visibility: hidden">
    <input type="hidden" name="myhidden1">
    <input type="text" name="myhidden2" style="display: none">
</form>
Run codeHide result
0

Source: https://habr.com/ru/post/1623780/


All Articles