1.Google Map を表示します
http://maps.google.co.jp/
2.URL 欄に次のように打ちこみます
javascript: (function(){setTimeout(function(){alert('timeout')}, 5000)})()
3.次の操作を行います
キーボードで地図移動⇒アラートが出る⇒キーを離す⇒アラートを消す⇒地図はとまる
このとき、Google Map は KeyDown や KeyUp でしかキーの状態が取得できないと思うのですが
どうして移動をとめることができるのでしょうか
alert を補足するイベントがあるのでしょうか
それとも、キーの状態をタイマーでチェックしているのでしょうか
(キーイベント以外で状態を補足できるのでしょうか?)
教えてください
javascriptはマルチスレッドではないので、alertのモーダルダイアログで(モーダルではない処理系もあるが) 他の処理が止まるのは当然だと思うのですが。
おそらく、キーを押し続けて地図がスクロール処理としては
0) キーのUp Down を捕らえて、キーの状態を保存するだけのハンドラある 1) 矢印キーの押下を検知してスクロール処理を開始 2) 地図をスクロールしてsetTimeoutでリピートする 3) 2のタイムアウトハンドラでキーの状態をチェックし、押されていれば 2へ、キーが押されていなければスクロール停止
こんな感じの処理だと思います。
そこでスクロール途中にモーダルダイアログが表示されるため、ダイアログ表示中は 2 と 3 の処理が止まるのだと思います。
そして処理が止まっているうちにキーが離されるため、スクロールの処理が継続しないんじゃないかと思います。
ソースを読めば分ると思いますが、難読化されているので読もうという気になれませんね。
質問の補足をありがとうございます。
私もそこまでは想像していました。
>3) 2のタイムアウトハンドラでキーの状態をチェックし、押されていれば 2へ、キーが押されていなければスクロール停止
ここで、キーの状態をチェックする方法はありますでしょうか?
KeyUp, KeyDown ではそのイベントを起こしたキーが何か、という情報はくるのですが
「今何が押されている」という情報は取得できません
→ を押したときは →
→ をそのままにして ↓ を押したときは ↓ だけきます
ご存知でしたらその部分を詳しく教えていただけるとたすかります