OSDN Git Service

88df0ce5f0d41a6be91f3ee3ffae69f2ba586199
[pettanr/clientJs.git] / 0.6.x / js / 11_hid / 01_KB.js
1 /*\r
2  * JavaScript : Opera と Firefox でのキーイベントの違い\r
3  * http://blog.livedoor.jp/tzifa/archives/50776590.html\r
4  *  keydown について。Firefox では押している間中リスナの関数が実行される\r
5  *  デフォルトイベントの制御・抑止 (opera)keypress を用いる。\r
6  * \r
7  * \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
12  *    \r
13  *  3. RWIN:92!(Opera<9.5), alt:18, [F1]-[F12]:112-123\r
14  * \r
15  */\r
16 \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
28         X_KB_CANCELED    = {},\r
29         X_KB_lastIs10Key = false,\r
30         X_KB_lastKeyCode = 0, \r
31         X_KB_TRANSFOEM   = {},\r
32         \r
33         // TODO keyevent のためには input 等にフォーカスが必要 -> iOS\r
34         \r
35         X_kbManager    =\r
36                 X_Class_override(\r
37                         X_EventDispatcher(),\r
38                         {       \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
43                                                 special;\r
44                                         \r
45                                         // console.log( e.type + ' > keyCode:' + keyCode + ' chrCode:' + chrCode );\r
46                                         \r
47                                         switch( e.type ){\r
48                                                 case 'keydown' :\r
49                                                         if( X_KB_DOWN_KEYS[ keyCode ] ){\r
50                                                                 // 既に押されている、メタキー[shift,ctrl,alt]の変化はある?\r
51                                                                 console.log( ' doen -- ' );\r
52                                                                 \r
53                                                                 return X_KB_CANCELED[ keyCode ] ? X_CALLBACK_PREVENT_DEFAULT : cb;\r
54                                                         } else\r
55                                                         if( special = X_KB_SPECIALS[ keyCode ] ){\r
56                                                                 \r
57                                                                 if( X_Type_isNumber( special ) ){\r
58                                                                         // テンキーの [0]~[9]\r
59                                                                         //chrCode = special;\r
60                                                                         X_KB_lastKeyCode = keyCode;\r
61                                                                         X_KB_lastIs10Key = true;\r
62                                                                         return cb;\r
63                                                                 } else {\r
64                                                                         X_KB_DOWN_KEYS[ keyCode ] = true;\r
65                                                                         chrCode = 0;\r
66                                                                 };\r
67                                                                 \r
68                                                                 cb = this[ 'dispatch' ]( {\r
69                                                                         type      : 'keydown',\r
70                                                                         keyCode   : keyCode,\r
71                                                                         charCode  : chrCode,\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
78                                                                 } );\r
79                                                                 \r
80                                                                 if( cb & X_CALLBACK_PREVENT_DEFAULT ){\r
81                                                                         X_KB_CANCELED[ keyCode ] = true;\r
82                                                                 };\r
83                                                                 /*\r
84                                                                 if( special === 'APP' ){\r
85                                                                         X_ViewPort_active = false;\r
86                                                                         X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_DEACTIVATE );\r
87                                                                 }; */\r
88                                                         } else {\r
89                                                                 X_KB_lastKeyCode = keyCode;\r
90                                                                 \r
91                                                                 if( e.ctrlKey || e.altKey || e.metaKey ){\r
92                                                                         cb = this[ 'dispatch' ]( {\r
93                                                                                 type      : 'keydown',\r
94                                                                                 keyCode   : 0,\r
95                                                                                 charCode  : chrCode,\r
96                                                                                 'keyName' : '',\r
97                                                                                 'is10key' : false,\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
102                                                                         } );\r
103                                                                         \r
104                                                                         if( cb & X_CALLBACK_PREVENT_DEFAULT ){\r
105                                                                                 X_KB_CANCELED[ keyCode ] = true;\r
106                                                                         };\r
107                                                                 };\r
108                                                                 console.log( ' keydown[' + keyCode + ']' + String.fromCharCode( chrCode ) + chrCode );\r
109                                                         };\r
110                                                         return cb;\r
111                                                         \r
112                                                 case 'keypress' :\r
113                                                         // keydown 側で発火しているものは再び発火しない\r
114                                                         if( X_KB_DOWN_KEYS[ chrCode ] ){\r
115                                                                 // TODO keypress\r
116                                                                 return X_KB_CANCELED[ chrCode ] ? X_CALLBACK_PREVENT_DEFAULT : cb;\r
117                                                         } else\r
118                                                         if( keyCode === 32 ){\r
119                                                                 chrCode = 32;\r
120                                                         };\r
121 \r
122                                                         if( 32 <= chrCode && chrCode <= 126 ){\r
123                                                                 X_KB_TRANSFOEM[ X_KB_lastKeyCode ] = chrCode;\r
124                                                                 \r
125                                                                 cb = this[ 'dispatch' ]( {\r
126                                                                         type      : 'keydown',\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
134                                                                 } );\r
135                                                                 \r
136                                                                 X_KB_lastIs10Key = false;\r
137                                                                 \r
138                                                                 console.log( X_KB_lastKeyCode + 'keypress : chrCode:' + chrCode + ' down:' + X_KB_DOWN_KEYS[ chrCode ] + ( X_KB_CANCELED[ chrCode ] ? ' Cancel!' : '' ) );\r
139                                                         } else {\r
140                                                                 console.log( '>> keypress : chrCode:' + chrCode + ' down:' + X_KB_DOWN_KEYS[ chrCode ] + ( X_KB_CANCELED[ chrCode ] ? ' Cancel!' : '' ) );\r
141                                                         };\r
142                                                         return cb;\r
143                                                         \r
144                                                 case 'keyup' :\r
145                                                         if( X_KB_CANCELED[ keyCode ] ){\r
146                                                                 cb = X_CALLBACK_PREVENT_DEFAULT;\r
147                                                         };\r
148                                                 \r
149                                                         if( ( special = X_KB_SPECIALS[ keyCode ] ) && ( !X_KB_DOWN_KEYS[ keyCode ] && !X_KB_DOWN_KEYS[ special ] ) ){\r
150                                                                 cb |= this[ 'dispatch' ]( {\r
151                                                                         type        : 'keydown',\r
152                                                                         keyCode     : keyCode,\r
153                                                                         charCode    : 0,\r
154                                                                         'keyName'   : special,\r
155                                                                         'is10key'   : false,\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
161                                                                 } );\r
162                                                         };\r
163                                                 \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
166                                                         \r
167                                                         \r
168                                                         if( !special ){\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
173                                                         } else\r
174                                                         if( 42 <= special ){\r
175                                                                 chrCode = special; // ie8で必要... Firefox でもテンキーの+-*/ で必要...\r
176                                                         } else {\r
177                                                                 chrCode = 0;\r
178                                                         };\r
179                                                         \r
180                                                         //console.log( keyCode + ' keyup ' + chrCode );\r
181                                                         \r
182                                                         cb |= this[ 'dispatch' ]( {\r
183                                                                 type      : 'keyup',\r
184                                                                 keyCode   : keyCode,\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
191                                                         } );\r
192                                                         \r
193                                                         return cb;\r
194                                                 \r
195                                                 case X_EVENT_VIEW_ACTIVATE :\r
196                                                         //\r
197                                                         break;\r
198                                                 case X_EVENT_VIEW_DEACTIVATE :\r
199                                                         //\r
200                                                         break;  \r
201                                         };\r
202                                 }\r
203                         }\r
204                 ),\r
205 \r
206 /**\r
207  * キーボードイベント情報を提供するオブジェクト。\r
208  * @namespace X.KB\r
209  * @alias X.KB\r
210  */\r
211         X_KB = X[ 'KB' ] = {\r
212                 /**\r
213                  * \r
214                  * @alias X.KB.listen\r
215                  */\r
216                 'listen' : function( type, arg1, arg2, arg3 ){\r
217                         type && arg1 && X_kbManager[ 'listen' ]( type, arg1, arg2, arg3 );\r
218                         return X_KB;\r
219                 },\r
220                 \r
221                 /**\r
222                  * \r
223                  * @alias X.KB.listenOnce\r
224                  */\r
225                 'listenOnce' : function( type, arg1, arg2, arg3 ){\r
226                         type && arg1 && X_kbManager[ 'listenOnce' ]( type, arg1, arg2, arg3 );\r
227                         return X_KB;\r
228                 },\r
229                 \r
230                 /**\r
231                  * \r
232                  * @alias X.KB.unlisten\r
233                  */\r
234                 'unlisten' : function( type, arg1, arg2, arg3 ){\r
235                         type && arg1 && X_kbManager[ 'unlisten' ]( type, arg1, arg2, arg3 );\r
236                         return X_KB;\r
237                 },\r
238                 \r
239                 /**\r
240                  * \r
241                  * @alias X.KB.listening\r
242                  */\r
243                 'listening' : function( type, arg1, arg2, arg3 ){\r
244                         return X_kbManager[ 'listening' ]( type, arg1, arg2, arg3 );\r
245                 }\r
246         };\r
247 \r
248 X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_kbManager );\r
249 \r
250 if( X_UA[ 'IE' ] < 9 ){\r
251         X_ViewPort_document[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );\r
252 } else {\r
253         X_ViewPort[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );\r
254 };\r