OSDN Git Service

4d4604750fb4bff180e5a365084fb9c9e614b718
[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_SPECIALS = {\r
22 \r
23         \r
24                 '8'   : 'BS',\r
25                 '9'   : 'TAB',\r
26                 '13'  : 'ENTER',\r
27                 '16'  : 'SHIFT',\r
28                 '17'  : 'CTRL',\r
29                 '18'  : 'ALT',\r
30                 '19'  : 'PAUSE_BREAK',\r
31                 '20'  : 'SHIFT+CAPS_LOCK',\r
32                 \r
33                 '27'  : 'ESC',\r
34                 '28'  : 'trans',\r
35                 '29'  : 'no trans',\r
36 \r
37                 '33'  : 'PAGE_UP',\r
38                 '34'  : 'PAGE_DOWN',\r
39                 '35'  : 'END',\r
40                 '36'  : 'HOME', \r
41                 '37'  : 'CSR_L',\r
42                 '38'  : 'CSR_U',\r
43                 '39'  : 'CSR_R',\r
44                 '40'  : 'CSR_D',\r
45                 '44'  : 'PRT_SCRN',             \r
46                 '45'  : 'INS',\r
47                 '46'  : 'DEL',\r
48                 \r
49                 '91'  : 'LWIN',\r
50                 '92'  : 'RWIN',\r
51                 '93'  : 'APP',\r
52                 \r
53                 '96'  : 48,\r
54                 '97'  : 49,\r
55                 '98'  : 50,\r
56                 '99'  : 51,\r
57                 '100' : 52,\r
58                 '101' : 53,\r
59                 '102' : 54,\r
60                 '103' : 55,\r
61                 '104' : 56,\r
62                 '105' : 57,\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         X_KB_DOWN_KEYS   = {},\r
89         X_KB_CANCELED    = {},\r
90         X_KB_lastIs10Key = false,\r
91         X_KB_lastKeyCode = 0, \r
92         X_KB_TRANSFOEM   = {},\r
93         \r
94         X_kbManager    =\r
95                 X_Class_override(\r
96                         X_EventDispatcher(),\r
97                         {       \r
98                                 handleEvent : function( e ){\r
99                                         var keyCode = e.keyCode,  // keyCode says something about the actual keyboard key the user pressed\r
100                                                 chrCode = e.charCode, // while charCode gives the ASCII value of the resulting character\r
101                                                 cb      = X_CALLBACK_NONE,\r
102                                                 special, is10Key, _keyCode;\r
103                                         \r
104                                         console.log( e.type + ' > keyCode:' + keyCode + ' chrCode:' + chrCode );\r
105                                         \r
106                                         switch( e.type ){\r
107                                                 case 'keydown' :\r
108                                                         if( X_KB_DOWN_KEYS[ keyCode ] ){\r
109                                                                 // 既に押されている、メタキー[shift,ctrl,alt]の変化はある?\r
110                                                                 return X_KB_CANCELED[ keyCode ] ? X_CALLBACK_PREVENT_DEFAULT : cb;\r
111                                                         } else\r
112                                                         if( special = X_KB_SPECIALS[ keyCode ] ){\r
113                                                                 \r
114                                                                 if( X_Type_isNumber( special ) ){\r
115                                                                         // テンキーの [0]~[9]\r
116                                                                         //chrCode = special;\r
117                                                                         X_KB_lastKeyCode = keyCode;\r
118                                                                         X_KB_lastIs10Key = true;\r
119                                                                         return cb;\r
120                                                                 } else {\r
121                                                                         X_KB_DOWN_KEYS[ keyCode ] = true;\r
122                                                                         chrCode = 0;\r
123                                                                 };\r
124                                                                 \r
125                                                                 cb = this[ 'dispatch' ]( {\r
126                                                                         type     : 'keydown',\r
127                                                                         keyCode  : keyCode,\r
128                                                                         charCode : chrCode,\r
129                                                                         keyName  : X_Type_isString( special ) ? special : '',\r
130                                                                         is10key  : !!is10Key,\r
131                                                                         shiftKey : !!X_KB_DOWN_KEYS[ 16 ],\r
132                                                                         ctrlKey  : !!X_KB_DOWN_KEYS[ 17 ],\r
133                                                                         altKey   : !!X_KB_DOWN_KEYS[ 18 ],\r
134                                                                         metaKey  : !!X_KB_DOWN_KEYS[ 224 ]\r
135                                                                 } );\r
136                                                                 \r
137                                                                 if( cb & X_CALLBACK_PREVENT_DEFAULT ){\r
138                                                                         X_KB_CANCELED[ keyCode ] = true;\r
139                                                                 };\r
140                                                                 /*\r
141                                                                 if( special === 'APP' ){\r
142                                                                         X_ViewPort_active = false;\r
143                                                                         X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_DEACTIVATE );\r
144                                                                 }; */\r
145                                                         } else {\r
146                                                                 X_KB_lastKeyCode = keyCode;\r
147                                                         };      \r
148                                                         return cb;\r
149                                                         \r
150                                                 case 'keypress' :\r
151                                                         // keydown 側で発火しているものは再び発火しない\r
152                                                         console.log( 'keypress : chrCode:' + chrCode + ' down:' + X_KB_DOWN_KEYS[ chrCode ] + ( X_KB_CANCELED[ chrCode ] ? ' Cancel!' : '' ) );\r
153                                                         if( X_KB_DOWN_KEYS[ chrCode ] ){\r
154                                                                 return X_KB_CANCELED[ chrCode ] ? X_CALLBACK_PREVENT_DEFAULT : cb;\r
155                                                         } else\r
156                                                         if( keyCode === 32 ){\r
157                                                                 charCode = 32;\r
158                                                         };\r
159 \r
160                                                         if( 32 <= chrCode && chrCode <= 126 ){\r
161                                                                 X_KB_TRANSFOEM[ X_KB_lastKeyCode ] = chrCode;\r
162                                                                 \r
163                                                                 cb = this[ 'dispatch' ]( {\r
164                                                                         type     : 'keydown',\r
165                                                                         keyCode  : X_KB_lastIs10Key ? X_KB_lastKeyCode : 0,\r
166                                                                         charCode : chrCode,\r
167                                                                         is10key  : X_KB_lastIs10Key,\r
168                                                                         shiftKey : !!X_KB_DOWN_KEYS[ 16 ],\r
169                                                                         ctrlKey  : !!X_KB_DOWN_KEYS[ 17 ],\r
170                                                                         altKey   : !!X_KB_DOWN_KEYS[ 18 ],\r
171                                                                         metaKey  : !!X_KB_DOWN_KEYS[ 224 ]\r
172                                                                 } );\r
173                                                                 \r
174                                                                 X_KB_lastIs10Key = true;\r
175                                                         };\r
176                                                         return cb;\r
177                                                         \r
178                                                 case 'keyup' :\r
179                                                         if( X_KB_CANCELED[ keyCode ] ){\r
180                                                                 cb = X_CALLBACK_PREVENT_DEFAULT;\r
181                                                         };\r
182                                                 \r
183                                                         if( ( special = X_KB_SPECIALS[ keyCode ] ) && ( !X_KB_DOWN_KEYS[ keyCode ] && !X_KB_DOWN_KEYS[ special ] ) ){\r
184                                                                 cb |= this[ 'dispatch' ]( {\r
185                                                                         type      : 'keydown',\r
186                                                                         keyCode   : keyCode,\r
187                                                                         charCode  : 0,\r
188                                                                         keyName   : special,\r
189                                                                         is10key   : false,\r
190                                                                         isVirtual : true,\r
191                                                                         shiftKey  : !!X_KB_DOWN_KEYS[ 16 ],\r
192                                                                         ctrlKey   : !!X_KB_DOWN_KEYS[ 17 ],\r
193                                                                         altKey    : !!X_KB_DOWN_KEYS[ 18 ],\r
194                                                                         metaKey   : !!X_KB_DOWN_KEYS[ 224 ]\r
195                                                                 } );\r
196                                                         };\r
197                                                 \r
198                                                         if( X_KB_DOWN_KEYS[ keyCode ] ) delete X_KB_DOWN_KEYS[ keyCode ];\r
199                                                         if( X_KB_CANCELED[ keyCode ]  ) delete X_KB_CANCELED[ keyCode ];\r
200                                                         \r
201                                                         chrCode = 0;\r
202                                                         if( !special ){\r
203                                                                 // keyCode から charCode を復帰する\r
204                                                                 chrCode = X_KB_TRANSFOEM[ keyCode ];\r
205                                                                 if( !chrCode ) return cb;\r
206                                                                 delete X_KB_TRANSFOEM[ keyCode ];\r
207                                                         };\r
208                                                 \r
209                                                         cb |= this[ 'dispatch' ]( {\r
210                                                                 type     : 'keyup',\r
211                                                                 keyCode  : keyCode,\r
212                                                                 charCode : chrCode,\r
213                                                                 keyName  : X_Type_isString( special ) ? special : '',\r
214                                                                 shiftKey : X_KB_DOWN_KEYS[ 16 ],\r
215                                                                 ctrlKey  : X_KB_DOWN_KEYS[ 17 ],\r
216                                                                 altKey   : X_KB_DOWN_KEYS[ 18 ],\r
217                                                                 metaKey  : X_KB_DOWN_KEYS[ 224 ]\r
218                                                         } );\r
219 \r
220                                                         return cb;\r
221                                                 \r
222                                                 case X_EVENT_VIEW_ACTIVATE :\r
223                                                         //\r
224                                                         break;\r
225                                                 case X_EVENT_VIEW_DEACTIVATE :\r
226                                                         //\r
227                                                         break;  \r
228                                         };\r
229                                 }\r
230                         }\r
231                 ),\r
232 \r
233 /**\r
234  * キーボードイベント情報を提供するオブジェクト。\r
235  * @namespace X.KB\r
236  * @alias X.KB\r
237  */\r
238         X_KB = X[ 'KB' ] = {\r
239                 /**\r
240                  * \r
241                  * @alias X.KB.listen\r
242                  */\r
243                 'listen' : function( type, arg1, arg2, arg3 ){\r
244                         type && arg1 && X_kbManager[ 'listen' ]( type, arg1, arg2, arg3 );\r
245                         return X_KB;\r
246                 },\r
247                 \r
248                 /**\r
249                  * \r
250                  * @alias X.KB.listenOnce\r
251                  */\r
252                 'listenOnce' : function( type, arg1, arg2, arg3 ){\r
253                         type && arg1 && X_kbManager[ 'listenOnce' ]( type, arg1, arg2, arg3 );\r
254                         return X_KB;\r
255                 },\r
256                 \r
257                 /**\r
258                  * \r
259                  * @alias X.KB.unlisten\r
260                  */\r
261                 'unlisten' : function( type, arg1, arg2, arg3 ){\r
262                         type && arg1 && X_kbManager[ 'unlisten' ]( type, arg1, arg2, arg3 );\r
263                         return X_KB;\r
264                 },\r
265                 \r
266                 /**\r
267                  * \r
268                  * @alias X.KB.listening\r
269                  */\r
270                 'listening' : function( type, arg1, arg2, arg3 ){\r
271                         return X_kbManager[ 'listening' ]( type, arg1, arg2, arg3 );\r
272                 }\r
273         };\r
274 \r
275 X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_kbManager );\r
276 \r
277 if( X_UA[ 'IE' ] < 9 ){\r
278         X_ViewPort_document[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );\r
279 } else {\r
280         X_ViewPort[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );\r
281 };\r