2 * JavaScript : Opera と Firefox でのキーイベントの違い
\r
3 * http://blog.livedoor.jp/tzifa/archives/50776590.html
\r
4 * keydown について。Firefox では押している間中リスナの関数が実行される
\r
5 * デフォルトイベントの制御・抑止 (opera)keypress を用いる。
\r
8 * http://www.keynavi.net/ja/tipsj/kfunc.html
\r
9 * keydown/up時にピリオドが文字化け (IE4-6) IE4+では「keypress」でキーコードを処理する 但しCtrlやALTが押されている場合は逆にkeydownで処理する必要があります
\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
17 * 3. RWIN:92!(Opera<9.5), alt:18, [F1]-[F12]:112-123
\r
21 var X_KB_SPECIALS = {
\r
30 '19' : 'PAUSE_BREAK',
\r
31 '20' : 'SHIFT+CAPS_LOCK',
\r
81 '145' : 'SCROLL_LOCK',
\r
82 '208' : 'CAPS_LOCK',
\r
83 '240' : 'CAPS_LOCK',
\r
88 X_KB_DOWN_KEYS = {},
\r
90 X_KB_lastIs10Key = false,
\r
91 X_KB_lastKeyCode = 0,
\r
92 X_KB_TRANSFOEM = {},
\r
96 X_EventDispatcher(),
\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
104 console.log( e.type + ' > keyCode:' + keyCode + ' chrCode:' + chrCode );
\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
112 if( special = X_KB_SPECIALS[ keyCode ] ){
\r
114 if( X_Type_isNumber( special ) ){
\r
116 //chrCode = special;
\r
117 X_KB_lastKeyCode = keyCode;
\r
118 X_KB_lastIs10Key = true;
\r
121 X_KB_DOWN_KEYS[ keyCode ] = true;
\r
125 cb = this[ 'dispatch' ]( {
\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
137 if( cb & X_CALLBACK_PREVENT_DEFAULT ){
\r
138 X_KB_CANCELED[ keyCode ] = true;
\r
141 if( special === 'APP' ){
\r
142 X_ViewPort_active = false;
\r
143 X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_DEACTIVATE );
\r
146 X_KB_lastKeyCode = keyCode;
\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
156 if( keyCode === 32 ){
\r
160 if( 32 <= chrCode && chrCode <= 126 ){
\r
161 X_KB_TRANSFOEM[ X_KB_lastKeyCode ] = chrCode;
\r
163 cb = this[ 'dispatch' ]( {
\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
174 X_KB_lastIs10Key = true;
\r
179 if( X_KB_CANCELED[ keyCode ] ){
\r
180 cb = X_CALLBACK_PREVENT_DEFAULT;
\r
183 if( ( special = X_KB_SPECIALS[ keyCode ] ) && ( !X_KB_DOWN_KEYS[ keyCode ] && !X_KB_DOWN_KEYS[ special ] ) ){
\r
184 cb |= this[ 'dispatch' ]( {
\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
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
203 // keyCode から charCode を復帰する
\r
204 chrCode = X_KB_TRANSFOEM[ keyCode ];
\r
205 if( !chrCode ) return cb;
\r
206 delete X_KB_TRANSFOEM[ keyCode ];
\r
209 cb |= this[ 'dispatch' ]( {
\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
222 case X_EVENT_VIEW_ACTIVATE :
\r
225 case X_EVENT_VIEW_DEACTIVATE :
\r
234 * キーボードイベント情報を提供するオブジェクト。
\r
238 X_KB = X[ 'KB' ] = {
\r
241 * @alias X.KB.listen
\r
243 'listen' : function( type, arg1, arg2, arg3 ){
\r
244 type && arg1 && X_kbManager[ 'listen' ]( type, arg1, arg2, arg3 );
\r
250 * @alias X.KB.listenOnce
\r
252 'listenOnce' : function( type, arg1, arg2, arg3 ){
\r
253 type && arg1 && X_kbManager[ 'listenOnce' ]( type, arg1, arg2, arg3 );
\r
259 * @alias X.KB.unlisten
\r
261 'unlisten' : function( type, arg1, arg2, arg3 ){
\r
262 type && arg1 && X_kbManager[ 'unlisten' ]( type, arg1, arg2, arg3 );
\r
268 * @alias X.KB.listening
\r
270 'listening' : function( type, arg1, arg2, arg3 ){
\r
271 return X_kbManager[ 'listening' ]( type, arg1, arg2, arg3 );
\r
275 X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_kbManager );
\r
277 if( X_UA[ 'IE' ] < 9 ){
\r
278 X_ViewPort_document[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );
\r
280 X_ViewPort[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );
\r