今更ながら、エンターキーで項目を移動する。(個人的には反対なんだけど)

IEは、深く考えず。
エンターで次に、SHIFT+エンターで前に、ボタンは+CTRLで実行
TEXTAREAの場合はCTRL+Enterで、エリア内の改行。
tagIndex も無視かよ〜。

/* @cc_on*/
(function () {

  function isFormElement (e) {
    var n = e.tagName;
    return 'INPUT' === n || 'SELECT' === n || 'TEXTAREA' === n;
  }


  function getNextNode (node) {
    var n;

    if (n = node.firstChild)
      return n;

    do {
      if (n = node.nextSibling)
        return n;
    } while (node = node.parentNode);

    return null;
  }


  function getPreviousNode (node) {
    var n;

    if (n = node.previousSibling) {
      while (n.hasChildNodes ())
        n = n.lastChild;
      return n;
    }
    return node.parentNode;
  }

  
  function keyHandler (event) {
    var e  = event./*@if (1) srcElement @else@*/ target /*@end@*/;
    var keyCode = event./*@if (1) keyCode @else@*/ which /*@end@*/;
    var ne = e, shift, ctrl;
    
    if (! isFormElement (e))
      return;

    if (27 === keyCode)
      return e.blur();

    if (13 !== keyCode)
      return;

    shift = ('undefined' === typeof event.modifiers)
      ? event.shiftKey
      : event.modifiers & Event.SHIFT_MASK;

    ctrl = ('undefined' === typeof event.modifiers)
      ? event.ctrlKey
      : event.modifiers & Event.CONTROL_MASK;

    if (/submit|reset|button/.test (e.type))
      if (ctrl)
        return;

    if ('TEXTAREA' === e.tagName)
      if (ctrl) {
        var s = e.selectionStart;
        var v = e.value;
        e.value = v.substr (0, s) + "\n" + v.substr (s, v.length);
        e.focus ();
        e. setSelectionRange (++s, s);
        return event./*@if (1) returnValue = false @else@*/ preventDefault() /*@end@*/;
      }
        

    while (ne = shift ? getPreviousNode (ne): getNextNode (ne)) {
      if (1 !== ne.nodeType)
        continue;
      if (! isFormElement (ne))
        continue;
      if (ne.disabled || ne.readOnly || ne.type === 'hidden')
        continue;
      if ('none' === /*@if(1) ne.currentStyle.display @else@*/ ne.ownerDocument.defaultView.getComputedStyle (ne, null).display /*@end@*/)
        continue;

      try {
        ne.focus();
      
      } catch (err) { ; }
      break;
    }
    event./*@if (1) returnValue = false @else@*/ preventDefault() /*@end@*/;
    
  }
  
  document.addEventListener ('keypress', keyHandler, false);
  
}) ();