- - PR -
IE7 での Ctrl+ボタン押下の検出方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2009-03-30 21:32
お世話になっております、金丸と申します。
現在遂行しているプロジェクトで、 ショートカットキーはJavaScriptで なるべく防いで欲しい、という用件があります。 これを実現するために共通JavaScriptファイルを用意し、 以下のキーについては、window.document.onkeydown、 window.document.onclick イベントを拾って キー判定することで防ぐことが出来ました。 ・ESCキー ・F5キー ・Ctrl+Rキー ・Ctrl+Nキー ただし、Ctrlキーを押しながら リンクやボタンをクリックした場合だけは、 IE7のバグなのか、onclickイベント、onkeydownイベントが まったく飛びません。(無条件に新しいタブで開きます) onunloadイベントも試してみましたが、Ctrl+ボタンでは 元画面が閉じるわけではないので onunload も発生しません。 イベント検出方法が見つからず困っています。 どなたか、上記バグを回避する方法がありましたら 教えていただけると大変助かります。 考え付く方法としては 隠しフレームなどを用意して、 onload 時にフレームがあるかどうか判定し・・・ などのちょっとメンドクサイ方法しかないでしょうか…。。 現行の画面はわりと出来上がっているので、 なるべく共通処理だけで済む方法を探しています。 ちなみに、FireFoxで試してみたところ Ctrl+ボタン押下もちゃんとイベントとして拾えて、 抑制することが出来ました。 やはり、IE7のバグなのでしょうか・・・ | ||||||||
|
投稿日時: 2009-03-30 21:36
1. JavaScript を切っていたら、どうなりますか?
2. [TAB]や[Shift]+[TAB]、[Alt]などのショートカットも OFF ですか? ブラウザーという、別のアプリケーションの挙動を制御しようとすることが、無茶だと思います(って、何回書いただろう?というぐらい、類似の質問があります)。 | ||||||||
|
投稿日時: 2009-03-30 21:45
>Jitta さま
金丸です、お世話になります。 もちろん、完璧に制御できるなんて思っていません。 新規ウィンドウだって、ファイル⇒新規ウィンドウで やれらてしまえば、防ぎようがありません。 なので、“なるべく”・・・なのです。 客先への説明も、 “これはIE7のバグなのでどうしようもありません。” で十分通ります。 ただ、IE7 のバグを回避できる方法がもしあれば 実装しておきたいなぁ…という思いがあります。 やっぱり、これだけは防げないのでしょうか。 JavaScriptエキスパートの方々に、回避策をお聞きしたかったのです。 | ||||||||
|
投稿日時: 2009-03-31 12:41
追試をしてみたいので、このあたりをもうちょっと整理して提示してもらえないでしょうか。 この説明だけだと何を試せばよいか、よくわかりません。
ずいぶんと甘いお客さんですね。 うちのところの顧客は、ソースとなる資料(公式資料や、バグだと客観的に認められるような結果)を提示しないと絶対に認めてくれません。 | ||||||||
|
投稿日時: 2009-03-31 12:52
いろいろ試してみましたが、
たしかにanchorタグのonclickイベントはctrl+クリックまたはホイールクリックの時は補足してくれてないようですね。 onmousedownやonmouseupでは補足はできますが、clickのキャンセルはできませんでした。 私が試したのは
というようなコードです。 ctrl+clickなりwheelのクリックなりで新しいタブを開かないようにしたい。 という観点で試してみました。 ボタンは試してませんけどイメージボタン? | ||||||||
|
投稿日時: 2009-03-31 12:58
ふと思ってやってみたらできましたのでご報告(anchorだけですが)
<a href="aaa.html"><div onclick="event.cancelBubble=true;event.returnValue=false;">aaa</div></a> 無条件にクリックをキャンセルしますので、条件式は適宜追加してください (event.ctrlKey、event.ctrlLeftKeyなど) | ||||||||
|
投稿日時: 2009-03-31 13:26
>rainさん
デューンさんのやられているように、<a href=... onclick="xxx">xxx</a> とやって、onclick イベントが拾えないという感じです。 window.body.onclick などのイベントを定義しても、拾えません。 Shift+クリックなどだと、window.body.onclick で拾えるのです。
えぇ、かなり甘いです(^^: おかげでとっても助かっていますが、これでいいのか、、という感じです。 普通はバグの裏づけを提示しないと怒られるお客さんがほとんどですよね。 >デューンさん 早速の返信ありがとうございます! おぉぉ、すごいですね! <div> タグで囲うと、 イベントが拾えるようになるのですね。 <a href...> までイベントが bubble すると その上にイベントが飛ばなくなる…ってことのようですね。 あ、あとボタンはタブ開きませんでした。すみません、勘違いです。 でも、これだと全画面を改造しないといけないですよね。。 どうにかならないでしょうかね〜、、 onload イベントで全 <a> タグを走査して div タグを DOM操作で追加して…というのはちょっと嫌かもです。。(^^:: やはり Microsoftさんにお願いして、 バグを修正してもらうしかないですかね〜。。 #そもそも、IEのバグをむりやり回避するという 対処自体がお門違いなのかもしれませんが。。 [ メッセージ編集済み 編集者: さね 編集日時 2009-03-31 13:30 ] | ||||||||
|
投稿日時: 2009-03-31 13:57
そもそも、JavaScript のエキスパートではないあなたが、裏付けもせずに IE のバグだと断定することがお門違いです。 |