2010年11月2日火曜日

ブラウザのリロード防止

リロードの無効化が必要になったので実装しました。
※IE6,7,8で確認

[F5]、[Ctrl + R]によるリロード防止処理。
function preventReload(){
 var KEY_F5     = 116;
 var KEY_R      = 82;
 
 var e = window.event;
 var ctrl = e.ctrlKey;
 var preventFlg = false;
 
 switch (event.keyCode ){ 
  case KEY_F5:
   preventFlg = true;
   break;
  case KEY_R:
   if (ctrl) {
    preventFlg = true;
    break;
   }

 }
 if (preventFlg) {
  e.keyCode = 0;
  e.returnValue = false;
  return false;
 }
}

[F6]とか[Ctrl + Tab]でロケーションバーにフォーカス後
(ロケーションバーを表示してなくても)、[F5]を押下されると
効いてしまうんで、この辺も要件によっては無効化した方が
いいかもしれないですな。

まぁ、js無効化とかタイミング、お気に入り表示とかでも効いてしまったりするし、
そもそもクライアント側で完全に防止するのは不可能という前提で、
完全に防止したい場合は、サーバ側でワンタイムトークンとか
実装しておくのは必須。

ただ、普通の操作における誤操作防止にはある程度有効なので、
入れておくにこしたことはなさそう。


IEショートカットキー 一覧
http://www.microsoft.com/japan/enable/products/keyboard/default.mspx

その他[Alt + ←],[Alt + →]など防止したい場合は、
以下のサイトの実装が参考になると思います。

2010年11月1日月曜日

ブラウザの「閉じるボタン」のイベントを取得する

ちょっと必要になったので調べました。

ブラウザの閉じるボタンを押された時のイベントで処理をしたい場合。
function window.onbeforeunload() {
    if(((event.clientX > document.body.clientWidth) && (event.clientY<0)) || event.altKey ) {
        xxxFunc();
    }
}


IE7などのタブブラウザはこっち。
function window.onbeforeunload() {
    if( event.clientY < 0 || event.altKey ) {
         xxxFunc();
    }
}


▼IEのonbeforeunloadイベントの仕様はこちら
http://msdn.microsoft.com/en-us/library/ms536907.aspx


onbeforeunloadイベントは閉じるボタン以外でも
  • location.hrefに新しいlocation を設定した場合
  • location.reload() メソッド呼び出しの場合
  • window.close() をだした場合

などでも動作するので条件を入れるわけですが、
タブブラウザに合わせた実装だとロケーションバーにフォーカスをあてて
Enter押下でも動作してしまったり。。

なんかいい方法ないかな。。

参考URL
ブラウザの「閉じるボタン」とタブの「閉じるボタン」
IEでのonBeforeUnload の挙動
javascript:ページ遷移時に確認を出して、キャンセルしたら、遷移しないということをしたいと考えています。
IEの特定のキー操作を無効化