Steven
Steven

Reputation: 697

convert enter to tab, work with hidden fields

I have a script that converts "Enter" to "Tab", and it works great until I hit a hidden field on a form.

So, is there any way to detect the hidden field, and still use the script(in IE & 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>

Upvotes: 4

Views: 126

Answers (2)

gaetanoM
gaetanoM

Reputation: 42054

My proposal is full 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>

Upvotes: 0

Matthew
Matthew

Reputation: 817

Change your code to look like the following:

<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 the element you're about to focus is visible (not hidden).

EDIT: If you want to skip hidden fields entirely, use the below code.

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;
  }
}

Fiddle:

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

Upvotes: 1

Related Questions