OSDN Git Service

Version 0.6.178, fix X.KB for IE5-, X.HTMLAudio for ChromeWV & AOSP.
[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 = 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
32         X_KB_CANCELED    = {},\r
33         X_KB_lastIs10Key = false,\r
34         X_KB_lastKeyCode = 0, \r
35         X_KB_TRANSFOEM   = {},\r
36         \r
37         X_kbManager    =\r
38                 X_Class_override(\r
39                         X_EventDispatcher(),\r
40                         {       \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
46                                         \r
47                                         console.log( e.type + ' > keyCode:' + keyCode + ' chrCode:' + chrCode );\r
48                                         \r
49                                         switch( e.type ){\r
50                                                 case 'keydown' :\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
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  : !!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
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                                                         return cb;\r
92                                                         \r
93                                                 case 'keypress' :\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
98                                                         } else\r
99                                                         if( keyCode === 32 ){\r
100                                                                 charCode = 32;\r
101                                                         };\r
102 \r
103                                                         if( 32 <= chrCode && chrCode <= 126 ){\r
104                                                                 X_KB_TRANSFOEM[ X_KB_lastKeyCode ] = chrCode;\r
105                                                                 \r
106                                                                 cb = this[ 'dispatch' ]( {\r
107                                                                         type     : 'keydown',\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
115                                                                 } );\r
116                                                                 \r
117                                                                 X_KB_lastIs10Key = true;\r
118                                                         };\r
119                                                         return cb;\r
120                                                         \r
121                                                 case 'keyup' :\r
122                                                         if( X_KB_CANCELED[ keyCode ] ){\r
123                                                                 cb = X_CALLBACK_PREVENT_DEFAULT;\r
124                                                         };\r
125                                                 \r
126                                                         if( ( special = X_KB_SPECIALS[ keyCode ] ) && ( !X_KB_DOWN_KEYS[ keyCode ] && !X_KB_DOWN_KEYS[ special ] ) ){\r
127                                                                 cb |= this[ 'dispatch' ]( {\r
128                                                                         type      : 'keydown',\r
129                                                                         keyCode   : keyCode,\r
130                                                                         charCode  : 0,\r
131                                                                         keyName   : special,\r
132                                                                         is10key   : false,\r
133                                                                         isVirtual : true,\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
138                                                                 } );\r
139                                                         };\r
140                                                 \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
143                                                         \r
144                                                         chrCode = 0;\r
145                                                         if( !special ){\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
150                                                         };\r
151                                                 \r
152                                                         cb |= this[ 'dispatch' ]( {\r
153                                                                 type     : 'keyup',\r
154                                                                 keyCode  : keyCode,\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
161                                                         } );\r
162 \r
163                                                         return cb;\r
164                                                 \r
165                                                 case X_EVENT_VIEW_ACTIVATE :\r
166                                                         //\r
167                                                         break;\r
168                                                 case X_EVENT_VIEW_DEACTIVATE :\r
169                                                         //\r
170                                                         break;  \r
171                                         };\r
172                                 }\r
173                         }\r
174                 ),\r
175 \r
176 /**\r
177  * キーボードイベント情報を提供するオブジェクト。\r
178  * @namespace X.KB\r
179  * @alias X.KB\r
180  */\r
181         X_KB = X[ 'KB' ] = {\r
182                 /**\r
183                  * \r
184                  * @alias X.KB.listen\r
185                  */\r
186                 'listen' : function( type, arg1, arg2, arg3 ){\r
187                         type && arg1 && X_kbManager[ 'listen' ]( type, arg1, arg2, arg3 );\r
188                         return X_KB;\r
189                 },\r
190                 \r
191                 /**\r
192                  * \r
193                  * @alias X.KB.listenOnce\r
194                  */\r
195                 'listenOnce' : function( type, arg1, arg2, arg3 ){\r
196                         type && arg1 && X_kbManager[ 'listenOnce' ]( type, arg1, arg2, arg3 );\r
197                         return X_KB;\r
198                 },\r
199                 \r
200                 /**\r
201                  * \r
202                  * @alias X.KB.unlisten\r
203                  */\r
204                 'unlisten' : function( type, arg1, arg2, arg3 ){\r
205                         type && arg1 && X_kbManager[ 'unlisten' ]( type, arg1, arg2, arg3 );\r
206                         return X_KB;\r
207                 },\r
208                 \r
209                 /**\r
210                  * \r
211                  * @alias X.KB.listening\r
212                  */\r
213                 'listening' : function( type, arg1, arg2, arg3 ){\r
214                         return X_kbManager[ 'listening' ]( type, arg1, arg2, arg3 );\r
215                 }\r
216         };\r
217 \r
218 X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_kbManager );\r
219 \r
220 if( X_UA[ 'IE' ] < 9 ){\r
221         X_ViewPort_document[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );\r
222 } else {\r
223         X_ViewPort[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );\r
224 };\r