OSDN Git Service

Version 0.6.214, bug fixes 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_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, _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' : !!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                                                         return cb;\r
92                                                         \r
93                                                 case 'keypress' :\r
94                                                         // keydown 側で発火しているものは再び発火しない\r
95                                                         \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                                                                 chrCode = 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 = false;\r
118                                                                 \r
119                                                                 console.log( X_KB_lastKeyCode + 'keypress : chrCode:' + chrCode + ' down:' + X_KB_DOWN_KEYS[ chrCode ] + ( X_KB_CANCELED[ chrCode ] ? ' Cancel!' : '' ) );\r
120                                                         };\r
121                                                         return cb;\r
122                                                         \r
123                                                 case 'keyup' :\r
124                                                         if( X_KB_CANCELED[ keyCode ] ){\r
125                                                                 cb = X_CALLBACK_PREVENT_DEFAULT;\r
126                                                         };\r
127                                                 \r
128                                                         if( ( special = X_KB_SPECIALS[ keyCode ] ) && ( !X_KB_DOWN_KEYS[ keyCode ] && !X_KB_DOWN_KEYS[ special ] ) ){\r
129                                                                 cb |= this[ 'dispatch' ]( {\r
130                                                                         type        : 'keydown',\r
131                                                                         keyCode     : keyCode,\r
132                                                                         charCode    : 0,\r
133                                                                         'keyName'   : special,\r
134                                                                         'is10key'   : false,\r
135                                                                         'isVirtual' : true,\r
136                                                                         shiftKey    : !!X_KB_DOWN_KEYS[ 16 ],\r
137                                                                         ctrlKey     : !!X_KB_DOWN_KEYS[ 17 ],\r
138                                                                         altKey      : !!X_KB_DOWN_KEYS[ 18 ],\r
139                                                                         metaKey     : !!X_KB_DOWN_KEYS[ 224 ]\r
140                                                                 } );\r
141                                                         };\r
142                                                 \r
143                                                         if( X_KB_DOWN_KEYS[ keyCode ] ) delete X_KB_DOWN_KEYS[ keyCode ];\r
144                                                         if( X_KB_CANCELED[ keyCode ]  ) delete X_KB_CANCELED[ keyCode ];\r
145                                                         \r
146                                                         \r
147                                                         if( !special ){\r
148                                                                 // keyCode から charCode を復帰する\r
149                                                                 chrCode = X_KB_TRANSFOEM[ keyCode ];\r
150                                                                 if( !chrCode ) return cb;\r
151                                                                 delete X_KB_TRANSFOEM[ keyCode ];\r
152                                                         } else\r
153                                                         if( 42 <= special ){\r
154                                                                 chrCode = special; // ie8で必要... Firefox でもテンキーの+-*/ で必要...\r
155                                                         } else {\r
156                                                                 chrCode = 0;\r
157                                                         };\r
158                                                         \r
159                                                         console.log( keyCode + ' keyup ' + chrCode );\r
160                                                         \r
161                                                         cb |= this[ 'dispatch' ]( {\r
162                                                                 type      : 'keyup',\r
163                                                                 keyCode   : keyCode,\r
164                                                                 charCode  : chrCode,\r
165                                                                 'keyName' : X_Type_isString( special ) ? special : '',\r
166                                                                 shiftKey  : X_KB_DOWN_KEYS[ 16 ],\r
167                                                                 ctrlKey   : X_KB_DOWN_KEYS[ 17 ],\r
168                                                                 altKey    : X_KB_DOWN_KEYS[ 18 ],\r
169                                                                 metaKey   : X_KB_DOWN_KEYS[ 224 ]\r
170                                                         } );\r
171                                                         \r
172                                                         return cb;\r
173                                                 \r
174                                                 case X_EVENT_VIEW_ACTIVATE :\r
175                                                         //\r
176                                                         break;\r
177                                                 case X_EVENT_VIEW_DEACTIVATE :\r
178                                                         //\r
179                                                         break;  \r
180                                         };\r
181                                 }\r
182                         }\r
183                 ),\r
184 \r
185 /**\r
186  * キーボードイベント情報を提供するオブジェクト。\r
187  * @namespace X.KB\r
188  * @alias X.KB\r
189  */\r
190         X_KB = X[ 'KB' ] = {\r
191                 /**\r
192                  * \r
193                  * @alias X.KB.listen\r
194                  */\r
195                 'listen' : function( type, arg1, arg2, arg3 ){\r
196                         type && arg1 && X_kbManager[ 'listen' ]( type, arg1, arg2, arg3 );\r
197                         return X_KB;\r
198                 },\r
199                 \r
200                 /**\r
201                  * \r
202                  * @alias X.KB.listenOnce\r
203                  */\r
204                 'listenOnce' : function( type, arg1, arg2, arg3 ){\r
205                         type && arg1 && X_kbManager[ 'listenOnce' ]( type, arg1, arg2, arg3 );\r
206                         return X_KB;\r
207                 },\r
208                 \r
209                 /**\r
210                  * \r
211                  * @alias X.KB.unlisten\r
212                  */\r
213                 'unlisten' : function( type, arg1, arg2, arg3 ){\r
214                         type && arg1 && X_kbManager[ 'unlisten' ]( type, arg1, arg2, arg3 );\r
215                         return X_KB;\r
216                 },\r
217                 \r
218                 /**\r
219                  * \r
220                  * @alias X.KB.listening\r
221                  */\r
222                 'listening' : function( type, arg1, arg2, arg3 ){\r
223                         return X_kbManager[ 'listening' ]( type, arg1, arg2, arg3 );\r
224                 }\r
225         };\r
226 \r
227 X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_kbManager );\r
228 \r
229 if( X_UA[ 'IE' ] < 9 ){\r
230         X_ViewPort_document[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );\r
231 } else {\r
232         X_ViewPort[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );\r
233 };\r