今更ながら、エンターキーで項目を移動する。(個人的には反対なんだけど)
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); }) ();