OSDN Git Service

fix X.UA & X.Audio, add X.KB.
[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  * http://www.keynavi.net/ja/tipsj/kfunc.html\r
9  *  keydown/up時にピリオドが文字化け (IE4-6) IE4+では「keypress」でキーコードを処理する 但しCtrlやALTが押されている場合は逆にkeydownで処理する必要があります\r
10  * \r
11  * \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
16  *    \r
17  *  3. RWIN:92!(Opera<9.5), alt:18, [F1]-[F12]:112-123\r
18  * \r
19  */\r
20 \r
21 var X_KB_TABLE     = {\r
22                 specials : {\r
23                         '96'   : 48,\r
24                         '97'   : 49,\r
25                         '98'   : 50,\r
26                         '99'   : 51,\r
27                         '100'  : 52,\r
28                         '101'  : 53,\r
29                         '102'  : 54,\r
30                         '103'  : 55,\r
31                         '104'  : 56,\r
32                         '105'  : 57,\r
33 \r
34                         '8'    : 'BS',\r
35                         '9'    : 'TAB',\r
36                         '13'   : 'ENTER',\r
37                         '16'   : 'SHIFT',\r
38                         '17'   : 'CTRL',\r
39                         '18'   : 'ALT',\r
40                         '19'   : 'PAUSE_BREAK',\r
41                         '20'   : 'SHIFT+CAPS_LOCK',\r
42                         \r
43                         '27'   : 'ESC',\r
44                         '28'   : 'trans',\r
45                         '29'   : 'no trans',\r
46                         \r
47                         '33'  : 'PAGE_UP',\r
48                         '34'  : 'PAGE_DOWN',\r
49                         '35'  : 'END',\r
50                         '36'  : 'HOME', \r
51                         '37'  : 'CSR_L',\r
52                         '38'  : 'CSR_U',\r
53                         '39'  : 'CSR_R',\r
54                         '40'  : 'CSR_D',\r
55                         '45'  : 'INS',\r
56                         '44'  : 'PRT_SCRN',\r
57                         '46'  : 'DEL',\r
58                         \r
59                         '91'  : 'LWIN',\r
60                         '92'  : 'RWIN',\r
61                         '93'  : 'APP',\r
62                         \r
63                         '106' : 42,\r
64                         '107' : 43,\r
65                         '109' : 45,\r
66                         '111' : 47,\r
67                         '112' : 'F1',\r
68                         '113' : 'F2',\r
69                         '114' : 'F3',\r
70                         '115' : 'F4',\r
71                         '116' : 'F5',\r
72                         '117' : 'F6',\r
73                         '118' : 'F7',\r
74                         '119' : 'F8',\r
75                         '120' : 'F9',\r
76                         '121' : 'F10',\r
77                         '122' : 'F11',\r
78                         '123' : 'F12',\r
79 \r
80                         '144' : 'NUM_LOCK',\r
81                         '145' : 'SCROLL_LOCK',\r
82                         '208' : 'CAPS_LOCK',\r
83                         '240' : 'CAPS_LOCK',\r
84                         '242' : 'K/H',\r
85                         '243' : 'H/Z',\r
86                         '244' : 'H/Z'\r
87                         \r
88                 },\r
89         // keypress 時に keyCode を直す 0 の場合、イベント発火せず。どのキーが押されたか?判定できないため\r
90                 'keypress' : {\r
91                         // !-):33-41, *:42, +:43, ,:44, -:45, .:46, /:47, 0-9:48-57 , ::58 , ;:59 , <:60 , =:61, >:62, ?:63, @:64\r
92                         // A-Z:65-90, [:91, \:92, ]:93, ^:94, _:95, `:96, a-z:97-122, {:123, |:124, }:125, ~:126\r
93                 },\r
94                 \r
95                 'keyup' : {\r
96                         '189' : '45,61', // ie, safari\r
97                         '109' : '45,61', // firefox, opera\r
98                         \r
99                         '222' : '94,126', // firefox, ie, safari\r
100                         '94'  : '94,126', // opera\r
101 \r
102                         '226' : '92,95', // firefox, ie, safari,\r
103                         '220' : 9.5 <= X_UA[ 'Opera' ] ? '92,95,124' : '92,124', // firefox, ie, safari, opera9.50+\r
104                         '92'  : '92,95,124', // opera9.25\r
105                         \r
106                         '192' : '64,96', // firefox, ie, safari\r
107                         '64'  : '64,96', // opera\r
108                         \r
109                         '219' : '91,123', // firefox, ie, safari, opera9.50+\r
110                         '91'  : '91,123', // opera9.25\r
111                         \r
112                         '187' : '59,43', // ie, safari\r
113                         '61'  : '59,43', // firefox, opera\r
114                         \r
115                         '186' : '58,42', // ie, safari\r
116                         '59'  : '58,42', // firefox, opera\r
117                         \r
118                         '221' : '93,125', // firefox, ie, safari, opera9.50+\r
119                         '93'  : '93,125', // opera9.25\r
120                         \r
121                         '188' : '44,60', // firefox, ie, safari, opera9.50+\r
122                         '44'  : '44,60', // opera9.25\r
123                         \r
124                         '190' : '46,62', // firefox, ie, safari, opera9.50+\r
125                         '46'  : '46,62', // opera9.25\r
126                         \r
127                         '191' : '47,63', // firefox, ie, safari, opera9.50+\r
128                         '47'  : '47,63' // opera9.25\r
129                 }\r
130         },\r
131         X_KB_DOWN_KEYS   = {},\r
132         X_KB_CANCELED    = {},\r
133         X_KB_lastIs10Key = 0,\r
134         X_KB_lastKeyCode = 0, \r
135         X_KB_TRANSFOEM   = {},\r
136         \r
137         X_kbManager    =\r
138                 X_Class_override(\r
139                         X_EventDispatcher(),\r
140                         {       \r
141                                 handleEvent : function( e ){\r
142                                         var keyCode = e.keyCode,  // keyCode says something about the actual keyboard key the user pressed\r
143                                                 chrCode = e.charCode, // while charCode gives the ASCII value of the resulting character\r
144                                                 cb      = X_CALLBACK_NONE,\r
145                                                 special, is10Key, _keyCode;\r
146                                         \r
147                                         console.log( e.type + ' > keyCode:' + keyCode + ' chrCode:' + chrCode );\r
148                                         \r
149                                         switch( e.type ){\r
150                                                 case 'keydown' :\r
151 \r
152                                                         if( X_KB_DOWN_KEYS[ keyCode ] ){\r
153                                                                 // 既に押されている、メタキー[shift,ctrl,alt]の変化はある?\r
154                                                                 return cb;\r
155                                                         } else\r
156                                                         if( special = X_KB_TABLE.specials[ keyCode ] ){\r
157                                                                 \r
158                                                                 if( X_Type_isNumber( special ) ){\r
159                                                                         // テンキーの [0]~[9]\r
160                                                                         //chrCode = special;\r
161                                                                         X_KB_lastKeyCode  = keyCode;\r
162                                                                         X_KB_lastIs10Key = true;\r
163                                                                         return cb;\r
164                                                                 } else {\r
165                                                                         X_KB_DOWN_KEYS[ keyCode ] = true;\r
166                                                                         chrCode = 0;\r
167                                                                 };\r
168                                                                 \r
169                                                                 cb = this[ 'dispatch' ]( {\r
170                                                                         type     : 'keydown',\r
171                                                                         keyCode  : keyCode,\r
172                                                                         charCode : chrCode,\r
173                                                                         keyName  : X_Type_isString( special ) ? special : '',\r
174                                                                         is10key  : !!is10Key,\r
175                                                                         shiftKey : !!X_KB_DOWN_KEYS[ 16 ],\r
176                                                                         ctrlKey  : !!X_KB_DOWN_KEYS[ 17 ],\r
177                                                                         altKey   : !!X_KB_DOWN_KEYS[ 18 ],\r
178                                                                         metaKey  : !!X_KB_DOWN_KEYS[ 224 ]\r
179                                                                 } );\r
180                                                                 \r
181                                                                 if( cb & X_CALLBACK_PREVENT_DEFAULT ){\r
182                                                                         X_KB_CANCELED[ keyCode ] = true;\r
183                                                                 };\r
184                                                         } else {\r
185                                                                 X_KB_lastKeyCode = keyCode;\r
186                                                         };\r
187 \r
188                                                         return cb;\r
189                                                         \r
190                                                 case 'keypress' :\r
191                                                         // keydown 側で発火しているものは再び発火しない\r
192                                                         console.log( 'kp : ' + X_KB_DOWN_KEYS[ chrCode ] + ( X_KB_CANCELED[ chrCode ] ? ' Cancel!' : '' ) );\r
193                                                         if( X_KB_DOWN_KEYS[ chrCode ] ){\r
194                                                                 return X_KB_CANCELED[ chrCode ] ? X_CALLBACK_PREVENT_DEFAULT : cb;\r
195                                                         };\r
196 \r
197                                                         if( 33 <= chrCode && chrCode <= 126 ){\r
198                                                                 X_KB_TRANSFOEM[ X_KB_lastKeyCode ] = chrCode;\r
199                                                                 \r
200                                                                 cb = this[ 'dispatch' ]( {\r
201                                                                         type     : 'keydown',\r
202                                                                         keyCode  : X_KB_lastIs10Key ? X_KB_lastKeyCode : 0,\r
203                                                                         charCode : chrCode,\r
204                                                                         is10key  : X_KB_lastIs10Key,\r
205                                                                         shiftKey : !!X_KB_DOWN_KEYS[ 16 ],\r
206                                                                         ctrlKey  : !!X_KB_DOWN_KEYS[ 17 ],\r
207                                                                         altKey   : !!X_KB_DOWN_KEYS[ 18 ],\r
208                                                                         metaKey  : !!X_KB_DOWN_KEYS[ 224 ]\r
209                                                                 } );\r
210                                                                 \r
211                                                                 X_KB_lastIs10Key = true;\r
212                                                         };\r
213                                                         return cb;\r
214                                                         \r
215                                                 case 'keyup' :\r
216                                                         if( X_KB_CANCELED[ keyCode ] ){\r
217                                                                 cb = X_CALLBACK_PREVENT_DEFAULT;\r
218                                                         };\r
219                                                 \r
220                                                         if( ( special = X_KB_TABLE.specials[ keyCode ] ) && ( !X_KB_DOWN_KEYS[ keyCode ] && !X_KB_DOWN_KEYS[ special ] ) ){\r
221                                                                 cb |= this[ 'dispatch' ]( {\r
222                                                                         type      : 'keydown',\r
223                                                                         keyCode   : keyCode,\r
224                                                                         charCode  : 0,\r
225                                                                         keyName   : special,\r
226                                                                         is10key   : false,\r
227                                                                         isVirtual : true,\r
228                                                                         shiftKey  : !!X_KB_DOWN_KEYS[ 16 ],\r
229                                                                         ctrlKey   : !!X_KB_DOWN_KEYS[ 17 ],\r
230                                                                         altKey    : !!X_KB_DOWN_KEYS[ 18 ],\r
231                                                                         metaKey   : !!X_KB_DOWN_KEYS[ 224 ]\r
232                                                                 } );\r
233                                                         };\r
234                                                 \r
235                                                         if( X_KB_DOWN_KEYS[ keyCode ] ) delete X_KB_DOWN_KEYS[ keyCode ];\r
236                                                         if( X_KB_CANCELED[ keyCode ]  ) delete X_KB_CANCELED[ keyCode ];\r
237                                                         \r
238                                                         chrCode = 0;\r
239                                                         if( !special ){\r
240                                                                 chrCode = X_KB_TRANSFOEM[ keyCode ];\r
241                                                                 if( !chrCode ) return cb;\r
242                                                                 delete X_KB_TRANSFOEM[ keyCode ];\r
243                                                                 //keyCode = 0;\r
244                                                         };\r
245                                                 \r
246                                                         cb |= this[ 'dispatch' ]( {\r
247                                                                 type     : 'keyup',\r
248                                                                 keyCode  : keyCode,\r
249                                                                 charCode : chrCode,\r
250                                                                 keyName  : X_Type_isString( special ) ? special : '',\r
251                                                                 shiftKey : X_KB_DOWN_KEYS[ 16 ],\r
252                                                                 ctrlKey  : X_KB_DOWN_KEYS[ 17 ],\r
253                                                                 altKey   : X_KB_DOWN_KEYS[ 18 ],\r
254                                                                 metaKey  : X_KB_DOWN_KEYS[ 224 ]\r
255                                                         } );\r
256 \r
257                                                         return cb;\r
258                                                 \r
259                                                 case X_EVENT_VIEW_ACTIVATE :\r
260                                                         //\r
261                                                         break;\r
262                                                 case X_EVENT_VIEW_DEACTIVATE :\r
263                                                         //\r
264                                                         break;  \r
265                                         };\r
266                                 }\r
267                         }\r
268                 ),\r
269 \r
270 /**\r
271  * キーボードイベント情報を提供するオブジェクト。\r
272  * @namespace X.KB\r
273  * @alias X.KB\r
274  */\r
275         X_KB = X[ 'KB' ] = {\r
276                 /**\r
277                  * \r
278                  * @alias X.KB.listen\r
279                  */\r
280                 'listen' : function( type, arg1, arg2, arg3 ){\r
281                         type && arg1 && X_kbManager[ 'listen' ]( type, arg1, arg2, arg3 );\r
282                         return X_KB;\r
283                 },\r
284                 \r
285                 /**\r
286                  * \r
287                  * @alias X.KB.listenOnce\r
288                  */\r
289                 'listenOnce' : function( type, arg1, arg2, arg3 ){\r
290                         type && arg1 && X_kbManager[ 'listenOnce' ]( type, arg1, arg2, arg3 );\r
291                         return X_KB;\r
292                 },\r
293                 \r
294                 /**\r
295                  * \r
296                  * @alias X.KB.unlisten\r
297                  */\r
298                 'unlisten' : function( type, arg1, arg2, arg3 ){\r
299                         type && arg1 && X_kbManager[ 'unlisten' ]( type, arg1, arg2, arg3 );\r
300                         return X_KB;\r
301                 },\r
302                 \r
303                 /**\r
304                  * \r
305                  * @alias X.KB.listening\r
306                  */\r
307                 'listening' : function( type, arg1, arg2, arg3 ){\r
308                         return X_kbManager[ 'listening' ]( type, arg1, arg2, arg3 );\r
309                 }\r
310         };\r
311 \r
312 X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_kbManager );\r
313 \r
314 if( X_UA[ 'IE' ] < 9 ){\r
315         X_ViewPort_document[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );\r
316 } else {\r
317         X_ViewPort[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );\r
318 };\r