2 * JavaScript : Opera と Firefox でのキーイベントの違い
\r
3 * http://blog.livedoor.jp/tzifa/archives/50776590.html
\r
4 * keydown について。Firefox では押している間中リスナの関数が実行される
\r
5 * デフォルトイベントの制御・抑止 (opera)keypress を用いる。
\r
8 * http://www.keynavi.net/ja/tipsj/kfunc.html
\r
9 * keydown/up時にピリオドが文字化け (IE4-6) IE4+では「keypress」でキーコードを処理する 但しCtrlやALTが押されている場合は逆にkeydownで処理する必要があります
\r
12 * keydown をトリガーにイベントを発火するもの
\r
13 * 1. テンキーの 0~9 keyCode:96-105
\r
14 * 2. ScrollLock:145, Ins:45, PuaseBreak:19, HOME:36, PageUp:33, del:46, END:35, PageDown:34,
\r
15 * ←↑→↓:37-40, tab:9, capsLock:240or208, Shift+capslock:20, shift:16, ctrl:17, LWIN:91, BS:8,
\r
17 * 3. RWIN:92!(Opera<9.5), alt:18, [F1]-[F12]:112-123
\r
21 var X_KB_SPECIALS = eval( // IE5- 対策
\r
22 "({'8':'BS','9':'TAB'," +
\r
23 "'13':'ENTER','16':'SHIFT','17':'CTRL','18':'ALT','19':'PAUSE_BREAK','20':'SHIFT+CAPS_LOCK'," +
\r
24 "'27':'ESC','28':'trans','29':'notrans'," +
\r
25 "'33':'PAGE_UP','34':'PAGE_DOWN','35':'END','36':'HOME','37':'CSR_L','38':'CSR_U','39':'CSR_R','40':'CSR_D'," +
\r
26 "'44':'PRT_SCRN','45':'INS','46':'DEL'," +
\r
27 "'91':'LWIN','92':'RWIN','93':'APP'," +
\r
28 "'96':48,'97':49,'98':50,'99':51,'100':52,'101':53,'102':54,'103':55,'104':56,'105':57,'106':42,'107':43,'109':45," +
\r
29 "'111':47,'112':'F1','113':'F2','114':'F3','115':'F4','116':'F5','117':'F6','118':'F7','119':'F8','120':'F9','121':'F10','122':'F11','123':'F12'," +
\r
30 "'144':'NUM_LOCK','145':'SCROLL_LOCK','208':'CAPS_LOCK','240':'CAPS_LOCK','242':'K/H','243':'H/Z','244':'H/Z'})" ),
\r
31 X_KB_DOWN_KEYS = {},
\r
33 X_KB_lastIs10Key = false,
\r
34 X_KB_lastKeyCode = 0,
\r
35 X_KB_TRANSFOEM = {},
\r
39 X_EventDispatcher(),
\r
41 handleEvent : function( e ){
\r
42 var keyCode = e.keyCode, // keyCode says something about the actual keyboard key the user pressed
\r
43 chrCode = e.charCode, // while charCode gives the ASCII value of the resulting character
\r
44 cb = X_CALLBACK_NONE,
\r
45 special, is10Key, _keyCode;
\r
47 console.log( e.type + ' > keyCode:' + keyCode + ' chrCode:' + chrCode );
\r
51 if( X_KB_DOWN_KEYS[ keyCode ] ){
\r
52 // 既に押されている、メタキー[shift,ctrl,alt]の変化はある?
\r
53 return X_KB_CANCELED[ keyCode ] ? X_CALLBACK_PREVENT_DEFAULT : cb;
\r
55 if( special = X_KB_SPECIALS[ keyCode ] ){
\r
57 if( X_Type_isNumber( special ) ){
\r
59 //chrCode = special;
\r
60 X_KB_lastKeyCode = keyCode;
\r
61 X_KB_lastIs10Key = true;
\r
64 X_KB_DOWN_KEYS[ keyCode ] = true;
\r
68 cb = this[ 'dispatch' ]( {
\r
72 keyName : X_Type_isString( special ) ? special : '',
\r
73 is10key : !!is10Key,
\r
74 shiftKey : !!X_KB_DOWN_KEYS[ 16 ],
\r
75 ctrlKey : !!X_KB_DOWN_KEYS[ 17 ],
\r
76 altKey : !!X_KB_DOWN_KEYS[ 18 ],
\r
77 metaKey : !!X_KB_DOWN_KEYS[ 224 ]
\r
80 if( cb & X_CALLBACK_PREVENT_DEFAULT ){
\r
81 X_KB_CANCELED[ keyCode ] = true;
\r
84 if( special === 'APP' ){
\r
85 X_ViewPort_active = false;
\r
86 X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_DEACTIVATE );
\r
89 X_KB_lastKeyCode = keyCode;
\r
94 // keydown 側で発火しているものは再び発火しない
\r
95 console.log( 'keypress : chrCode:' + chrCode + ' down:' + X_KB_DOWN_KEYS[ chrCode ] + ( X_KB_CANCELED[ chrCode ] ? ' Cancel!' : '' ) );
\r
96 if( X_KB_DOWN_KEYS[ chrCode ] ){
\r
97 return X_KB_CANCELED[ chrCode ] ? X_CALLBACK_PREVENT_DEFAULT : cb;
\r
99 if( keyCode === 32 ){
\r
103 if( 32 <= chrCode && chrCode <= 126 ){
\r
104 X_KB_TRANSFOEM[ X_KB_lastKeyCode ] = chrCode;
\r
106 cb = this[ 'dispatch' ]( {
\r
108 keyCode : X_KB_lastIs10Key ? X_KB_lastKeyCode : 0,
\r
109 charCode : chrCode,
\r
110 is10key : X_KB_lastIs10Key,
\r
111 shiftKey : !!X_KB_DOWN_KEYS[ 16 ],
\r
112 ctrlKey : !!X_KB_DOWN_KEYS[ 17 ],
\r
113 altKey : !!X_KB_DOWN_KEYS[ 18 ],
\r
114 metaKey : !!X_KB_DOWN_KEYS[ 224 ]
\r
117 X_KB_lastIs10Key = true;
\r
122 if( X_KB_CANCELED[ keyCode ] ){
\r
123 cb = X_CALLBACK_PREVENT_DEFAULT;
\r
126 if( ( special = X_KB_SPECIALS[ keyCode ] ) && ( !X_KB_DOWN_KEYS[ keyCode ] && !X_KB_DOWN_KEYS[ special ] ) ){
\r
127 cb |= this[ 'dispatch' ]( {
\r
134 shiftKey : !!X_KB_DOWN_KEYS[ 16 ],
\r
135 ctrlKey : !!X_KB_DOWN_KEYS[ 17 ],
\r
136 altKey : !!X_KB_DOWN_KEYS[ 18 ],
\r
137 metaKey : !!X_KB_DOWN_KEYS[ 224 ]
\r
141 if( X_KB_DOWN_KEYS[ keyCode ] ) delete X_KB_DOWN_KEYS[ keyCode ];
\r
142 if( X_KB_CANCELED[ keyCode ] ) delete X_KB_CANCELED[ keyCode ];
\r
146 // keyCode から charCode を復帰する
\r
147 chrCode = X_KB_TRANSFOEM[ keyCode ];
\r
148 if( !chrCode ) return cb;
\r
149 delete X_KB_TRANSFOEM[ keyCode ];
\r
152 cb |= this[ 'dispatch' ]( {
\r
155 charCode : chrCode,
\r
156 keyName : X_Type_isString( special ) ? special : '',
\r
157 shiftKey : X_KB_DOWN_KEYS[ 16 ],
\r
158 ctrlKey : X_KB_DOWN_KEYS[ 17 ],
\r
159 altKey : X_KB_DOWN_KEYS[ 18 ],
\r
160 metaKey : X_KB_DOWN_KEYS[ 224 ]
\r
165 case X_EVENT_VIEW_ACTIVATE :
\r
168 case X_EVENT_VIEW_DEACTIVATE :
\r
177 * キーボードイベント情報を提供するオブジェクト。
\r
181 X_KB = X[ 'KB' ] = {
\r
184 * @alias X.KB.listen
\r
186 'listen' : function( type, arg1, arg2, arg3 ){
\r
187 type && arg1 && X_kbManager[ 'listen' ]( type, arg1, arg2, arg3 );
\r
193 * @alias X.KB.listenOnce
\r
195 'listenOnce' : function( type, arg1, arg2, arg3 ){
\r
196 type && arg1 && X_kbManager[ 'listenOnce' ]( type, arg1, arg2, arg3 );
\r
202 * @alias X.KB.unlisten
\r
204 'unlisten' : function( type, arg1, arg2, arg3 ){
\r
205 type && arg1 && X_kbManager[ 'unlisten' ]( type, arg1, arg2, arg3 );
\r
211 * @alias X.KB.listening
\r
213 'listening' : function( type, arg1, arg2, arg3 ){
\r
214 return X_kbManager[ 'listening' ]( type, arg1, arg2, arg3 );
\r
218 X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_kbManager );
\r
220 if( X_UA[ 'IE' ] < 9 ){
\r
221 X_ViewPort_document[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );
\r
223 X_ViewPort[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );
\r