2 * JavaScript : Opera と Firefox でのキーイベントの違い
\r
3 * http://blog.livedoor.jp/tzifa/archives/50776590.html
\r
4 * keydown について。Firefox では押している間中リスナの関数が実行される
\r
5 * デフォルトイベントの制御・抑止 (opera)keypress を用いる。
\r
8 * keydown をトリガーにイベントを発火するもの
\r
9 * 1. テンキーの 0~9 keyCode:96-105
\r
10 * 2. ScrollLock:145, Ins:45, PuaseBreak:19, HOME:36, PageUp:33, del:46, END:35, PageDown:34,
\r
11 * ←↑→↓:37-40, tab:9, capsLock:240or208, Shift+capslock:20, shift:16, ctrl:17, LWIN:91, BS:8,
\r
13 * 3. RWIN:92!(Opera<9.5), alt:18, [F1]-[F12]:112-123
\r
17 var X_KB_SPECIALS = eval( // IE5- 対策
\r
18 "({'8':'BS','9':'TAB'," +
\r
19 "'13':'ENTER','16':'SHIFT','17':'CTRL','18':'ALT','19':'PAUSE_BREAK','20':'SHIFT+CAPS_LOCK'," +
\r
20 "'27':'ESC','28':'trans','29':'notrans'," +
\r
21 "'33':'PAGE_UP','34':'PAGE_DOWN','35':'END','36':'HOME','37':'CSR_L','38':'CSR_U','39':'CSR_R','40':'CSR_D'," +
\r
22 "'44':'PRT_SCRN','45':'INS','46':'DEL'," +
\r
23 "'91':'LWIN','92':'RWIN','93':'APP'," +
\r
24 "'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,'110':46,'111':47," +
\r
25 "'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
26 "'144':'NUM_LOCK','145':'SCROLL_LOCK','208':'CAPS_LOCK','240':'CAPS_LOCK','242':'K/H','243':'H/Z','244':'H/Z'})" ),
\r
27 X_KB_DOWN_KEYS = {},
\r
29 X_KB_lastIs10Key = false,
\r
30 X_KB_lastKeyCode = 0,
\r
31 X_KB_TRANSFOEM = {},
\r
33 // TODO keyevent のためには input 等にフォーカスが必要 -> iOS
\r
37 X_EventDispatcher(),
\r
39 handleEvent : function( e ){
\r
40 var keyCode = e.keyCode, // keyCode says something about the actual keyboard key the user pressed
\r
41 chrCode = e.charCode, // while charCode gives the ASCII value of the resulting character
\r
42 cb = X_CALLBACK_NONE,
\r
45 // console.log( e.type + ' > keyCode:' + keyCode + ' chrCode:' + chrCode );
\r
49 if( X_KB_DOWN_KEYS[ keyCode ] ){
\r
50 // 既に押されている、メタキー[shift,ctrl,alt]の変化はある?
\r
51 console.log( ' doen -- ' );
\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' : !!X_KB_lastIs10Key,
\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
91 if( e.ctrlKey || e.altKey || e.metaKey ){
\r
92 cb = this[ 'dispatch' ]( {
\r
98 shiftKey : !!X_KB_DOWN_KEYS[ 16 ],
\r
99 ctrlKey : !!X_KB_DOWN_KEYS[ 17 ],
\r
100 altKey : !!X_KB_DOWN_KEYS[ 18 ],
\r
101 metaKey : !!X_KB_DOWN_KEYS[ 224 ]
\r
104 if( cb & X_CALLBACK_PREVENT_DEFAULT ){
\r
105 X_KB_CANCELED[ keyCode ] = true;
\r
108 console.log( ' keydown[' + keyCode + ']' + String.fromCharCode( chrCode ) + chrCode );
\r
113 // keydown 側で発火しているものは再び発火しない
\r
114 if( X_KB_DOWN_KEYS[ chrCode ] ){
\r
116 return X_KB_CANCELED[ chrCode ] ? X_CALLBACK_PREVENT_DEFAULT : cb;
\r
118 if( keyCode === 32 ){
\r
122 if( 32 <= chrCode && chrCode <= 126 ){
\r
123 X_KB_TRANSFOEM[ X_KB_lastKeyCode ] = chrCode;
\r
125 cb = this[ 'dispatch' ]( {
\r
127 keyCode : X_KB_lastIs10Key ? X_KB_lastKeyCode : 0,
\r
128 charCode : chrCode,
\r
129 'is10key' : X_KB_lastIs10Key,
\r
130 shiftKey : !!X_KB_DOWN_KEYS[ 16 ],
\r
131 ctrlKey : !!X_KB_DOWN_KEYS[ 17 ],
\r
132 altKey : !!X_KB_DOWN_KEYS[ 18 ],
\r
133 metaKey : !!X_KB_DOWN_KEYS[ 224 ]
\r
136 X_KB_lastIs10Key = false;
\r
138 console.log( X_KB_lastKeyCode + 'keypress : chrCode:' + chrCode + ' down:' + X_KB_DOWN_KEYS[ chrCode ] + ( X_KB_CANCELED[ chrCode ] ? ' Cancel!' : '' ) );
\r
140 console.log( '>> keypress : chrCode:' + chrCode + ' down:' + X_KB_DOWN_KEYS[ chrCode ] + ( X_KB_CANCELED[ chrCode ] ? ' Cancel!' : '' ) );
\r
145 if( X_KB_CANCELED[ keyCode ] ){
\r
146 cb = X_CALLBACK_PREVENT_DEFAULT;
\r
149 if( ( special = X_KB_SPECIALS[ keyCode ] ) && ( !X_KB_DOWN_KEYS[ keyCode ] && !X_KB_DOWN_KEYS[ special ] ) ){
\r
150 cb |= this[ 'dispatch' ]( {
\r
154 'keyName' : special,
\r
156 'isVirtual' : true,
\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
164 if( X_KB_DOWN_KEYS[ keyCode ] ) delete X_KB_DOWN_KEYS[ keyCode ];
\r
165 if( X_KB_CANCELED[ keyCode ] ) delete X_KB_CANCELED[ keyCode ];
\r
169 // keyCode から charCode を復帰する
\r
170 chrCode = X_KB_TRANSFOEM[ keyCode ];
\r
171 if( !chrCode ) return cb;
\r
172 delete X_KB_TRANSFOEM[ keyCode ];
\r
174 if( 42 <= special ){
\r
175 chrCode = special; // ie8で必要... Firefox でもテンキーの+-*/ で必要...
\r
180 //console.log( keyCode + ' keyup ' + chrCode );
\r
182 cb |= this[ 'dispatch' ]( {
\r
185 charCode : chrCode,
\r
186 'keyName' : X_Type_isString( special ) ? special : '',
\r
187 shiftKey : X_KB_DOWN_KEYS[ 16 ],
\r
188 ctrlKey : X_KB_DOWN_KEYS[ 17 ],
\r
189 altKey : X_KB_DOWN_KEYS[ 18 ],
\r
190 metaKey : X_KB_DOWN_KEYS[ 224 ]
\r
195 case X_EVENT_VIEW_ACTIVATE :
\r
198 case X_EVENT_VIEW_DEACTIVATE :
\r
207 * キーボードイベント情報を提供するオブジェクト。
\r
211 X_KB = X[ 'KB' ] = {
\r
214 * @alias X.KB.listen
\r
216 'listen' : function( type, arg1, arg2, arg3 ){
\r
217 type && arg1 && X_kbManager[ 'listen' ]( type, arg1, arg2, arg3 );
\r
223 * @alias X.KB.listenOnce
\r
225 'listenOnce' : function( type, arg1, arg2, arg3 ){
\r
226 type && arg1 && X_kbManager[ 'listenOnce' ]( type, arg1, arg2, arg3 );
\r
232 * @alias X.KB.unlisten
\r
234 'unlisten' : function( type, arg1, arg2, arg3 ){
\r
235 type && arg1 && X_kbManager[ 'unlisten' ]( type, arg1, arg2, arg3 );
\r
241 * @alias X.KB.listening
\r
243 'listening' : function( type, arg1, arg2, arg3 ){
\r
244 return X_kbManager[ 'listening' ]( type, arg1, arg2, arg3 );
\r
248 X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_kbManager );
\r
250 if( X_UA[ 'IE' ] < 9 ){
\r
251 X_ViewPort_document[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );
\r
253 X_ViewPort[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );
\r