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
40 '19' : 'PAUSE_BREAK',
\r
41 '20' : 'SHIFT+CAPS_LOCK',
\r
81 '145' : 'SCROLL_LOCK',
\r
82 '208' : 'CAPS_LOCK',
\r
83 '240' : 'CAPS_LOCK',
\r
89 // keypress 時に keyCode を直す 0 の場合、イベント発火せず。どのキーが押されたか?判定できないため
\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
96 '189' : '45,61', // ie, safari
\r
97 '109' : '45,61', // firefox, opera
\r
99 '222' : '94,126', // firefox, ie, safari
\r
100 '94' : '94,126', // opera
\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
106 '192' : '64,96', // firefox, ie, safari
\r
107 '64' : '64,96', // opera
\r
109 '219' : '91,123', // firefox, ie, safari, opera9.50+
\r
110 '91' : '91,123', // opera9.25
\r
112 '187' : '59,43', // ie, safari
\r
113 '61' : '59,43', // firefox, opera
\r
115 '186' : '58,42', // ie, safari
\r
116 '59' : '58,42', // firefox, opera
\r
118 '221' : '93,125', // firefox, ie, safari, opera9.50+
\r
119 '93' : '93,125', // opera9.25
\r
121 '188' : '44,60', // firefox, ie, safari, opera9.50+
\r
122 '44' : '44,60', // opera9.25
\r
124 '190' : '46,62', // firefox, ie, safari, opera9.50+
\r
125 '46' : '46,62', // opera9.25
\r
127 '191' : '47,63', // firefox, ie, safari, opera9.50+
\r
128 '47' : '47,63' // opera9.25
\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
139 X_EventDispatcher(),
\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
147 console.log( e.type + ' > keyCode:' + keyCode + ' chrCode:' + chrCode );
\r
152 if( X_KB_DOWN_KEYS[ keyCode ] ){
\r
153 // 既に押されている、メタキー[shift,ctrl,alt]の変化はある?
\r
156 if( special = X_KB_TABLE.specials[ keyCode ] ){
\r
158 if( X_Type_isNumber( special ) ){
\r
160 //chrCode = special;
\r
161 X_KB_lastKeyCode = keyCode;
\r
162 X_KB_lastIs10Key = true;
\r
165 X_KB_DOWN_KEYS[ keyCode ] = true;
\r
169 cb = this[ 'dispatch' ]( {
\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
181 if( cb & X_CALLBACK_PREVENT_DEFAULT ){
\r
182 X_KB_CANCELED[ keyCode ] = true;
\r
185 X_KB_lastKeyCode = keyCode;
\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
197 if( 33 <= chrCode && chrCode <= 126 ){
\r
198 X_KB_TRANSFOEM[ X_KB_lastKeyCode ] = chrCode;
\r
200 cb = this[ 'dispatch' ]( {
\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
211 X_KB_lastIs10Key = true;
\r
216 if( X_KB_CANCELED[ keyCode ] ){
\r
217 cb = X_CALLBACK_PREVENT_DEFAULT;
\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
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
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
240 chrCode = X_KB_TRANSFOEM[ keyCode ];
\r
241 if( !chrCode ) return cb;
\r
242 delete X_KB_TRANSFOEM[ keyCode ];
\r
246 cb |= this[ 'dispatch' ]( {
\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
259 case X_EVENT_VIEW_ACTIVATE :
\r
262 case X_EVENT_VIEW_DEACTIVATE :
\r
271 * キーボードイベント情報を提供するオブジェクト。
\r
275 X_KB = X[ 'KB' ] = {
\r
278 * @alias X.KB.listen
\r
280 'listen' : function( type, arg1, arg2, arg3 ){
\r
281 type && arg1 && X_kbManager[ 'listen' ]( type, arg1, arg2, arg3 );
\r
287 * @alias X.KB.listenOnce
\r
289 'listenOnce' : function( type, arg1, arg2, arg3 ){
\r
290 type && arg1 && X_kbManager[ 'listenOnce' ]( type, arg1, arg2, arg3 );
\r
296 * @alias X.KB.unlisten
\r
298 'unlisten' : function( type, arg1, arg2, arg3 ){
\r
299 type && arg1 && X_kbManager[ 'unlisten' ]( type, arg1, arg2, arg3 );
\r
305 * @alias X.KB.listening
\r
307 'listening' : function( type, arg1, arg2, arg3 ){
\r
308 return X_kbManager[ 'listening' ]( type, arg1, arg2, arg3 );
\r
312 X_ViewPort[ 'listen' ]( [ X_EVENT_VIEW_ACTIVATE, X_EVENT_VIEW_DEACTIVATE ], X_kbManager );
\r
314 if( X_UA[ 'IE' ] < 9 ){
\r
315 X_ViewPort_document[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );
\r
317 X_ViewPort[ 'listen' ]( [ 'keyup', 'keydown', 'keypress' ], X_kbManager );
\r