- PR -

IE7 での Ctrl+ボタン押下の検出方法

投稿者投稿内容
さね
会議室デビュー日: 2009/03/30
投稿数: 6
投稿日時: 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のバグなのでしょうか・・・
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-03-30 21:36
1. JavaScript を切っていたら、どうなりますか?
2. [TAB]や[Shift]+[TAB]、[Alt]などのショートカットも OFF ですか?


ブラウザーという、別のアプリケーションの挙動を制御しようとすることが、無茶だと思います(って、何回書いただろう?というぐらい、類似の質問があります)。
さね
会議室デビュー日: 2009/03/30
投稿数: 6
投稿日時: 2009-03-30 21:45
>Jitta さま

金丸です、お世話になります。

もちろん、完璧に制御できるなんて思っていません。
新規ウィンドウだって、ファイル⇒新規ウィンドウで
やれらてしまえば、防ぎようがありません。
なので、“なるべく”・・・なのです。

客先への説明も、
“これはIE7のバグなのでどうしようもありません。”
で十分通ります。

ただ、IE7 のバグを回避できる方法がもしあれば
実装しておきたいなぁ…という思いがあります。
やっぱり、これだけは防げないのでしょうか。
JavaScriptエキスパートの方々に、回避策をお聞きしたかったのです。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2009-03-31 12:41
引用:

さねさんの書き込み (2009-03-30 21:32) より:

ただし、Ctrlキーを押しながら
リンクやボタンをクリックした場合だけは、
IE7のバグなのか、onclickイベント、onkeydownイベントが
まったく飛びません。(無条件に新しいタブで開きます)
onunloadイベントも試してみましたが、Ctrl+ボタンでは
元画面が閉じるわけではないので onunload も発生しません。


追試をしてみたいので、このあたりをもうちょっと整理して提示してもらえないでしょうか。
この説明だけだと何を試せばよいか、よくわかりません。

引用:

さねさんの書き込み (2009-03-30 21:45) より:

客先への説明も、
“これはIE7のバグなのでどうしようもありません。”
で十分通ります。


ずいぶんと甘いお客さんですね。
うちのところの顧客は、ソースとなる資料(公式資料や、バグだと客観的に認められるような結果)を提示しないと絶対に認めてくれません。
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-03-31 12:52
いろいろ試してみましたが、
たしかにanchorタグのonclickイベントはctrl+クリックまたはホイールクリックの時は補足してくれてないようですね。


onmousedownやonmouseupでは補足はできますが、clickのキャンセルはできませんでした。


私が試したのは
コード:
<a href="aaa.html" onclick="..." onmousedown="...">aaa</a>


というようなコードです。

ctrl+clickなりwheelのクリックなりで新しいタブを開かないようにしたい。
という観点で試してみました。

ボタンは試してませんけどイメージボタン?
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 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/30
投稿数: 6
投稿日時: 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 ]
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2009-03-31 13:57
引用:

さねさんの書き込み (2009-03-31 13:26) より:

#そもそも、IEのバグをむりやり回避するという
 対処自体がお門違いなのかもしれませんが。。


そもそも、JavaScript のエキスパートではないあなたが、裏付けもせずに IE のバグだと断定することがお門違いです。

スキルアップ/キャリアアップ(JOB@IT)