FireFoxでブラウザの戻るキーを無効にしたい



0   名前: かわしま : 2007/04/13(金) 01:01  ID:gJjf9spD sub-B3
はじめまして、かわしまと申します。

ブラウザのBSキーによる戻る処理を無効にしようと、以下のスクリプトを
書いてみましたが、FireFoxでは前ページに戻ってしまいます。
IEではreturn false;でうまくいったのですが、FireFoxではダメで、
いろいろ調べてみた結果 preventDefault でいけそうなことがわかり書いて
みましたがうまく動きません。以下のスクリプトに何か問題あります
でしょうか?

また、テキスト入力域などではBSキーは有効にしたいので、activeElement
を使ってイベントの発生した箇所をチェックする処理もIEでは動作する
のですが、FireFoxではエラーになります。同等のことをFireFoxで実装する
にはどうすればよいでしょうか?

<!--

document.onkeydown = keyEventDistinct;

function keyEventDistinct(evt){

// BS
if(document.all){
var activeElmType = document.activeElement.type;
if ( event.keyCode == 8 ){
alert("IE:キー「BS」が投下されました。");
if ( (activeElmType != 'text')&&(activeElmType != 'textarea')&&(activeElmType != 'password')&&(activeElmType != 'file') ){
return false;
}
}
}else{
if ( evt.keyCode == 8 ){
alert("FF:キー「BS」が投下されました。");
evt.preventDefault();
}
}
}

//-->

1   名前: 匿名 : 2007/04/13(金) 01:01  ID:z4uQsZWC sub-Cz
> preventDefault

まず、return false すればデフォルトアクションがキャンセルされるという、レガシ− JavaScript な考え方は捨てるべし。

・DOM Events では、addEventListener でイベントを登録する。そうすれば、evt.preventDefault() でデフォルトアクションをキャンセルできる。

・IE Event Model では、attachEvent でイベントを登録する。デフォルトアクションのキャンセルには、window.event.returnValue = false にする(イベント型によっては逆転するバグがあるので注意)。

各イベントモデルに応じた柔軟な制御が必要なら、覚悟を決めて DOM Events と IE Event Model で分岐しる。なお、document.all で分岐してはいけない。先に引数の evt を調べ、次に window.event のチェックをするんだ。

> activeElement

IE の独自拡張だから、Opera くらいしか持っていない(実際、フォーカスが 1 つである必然性もない)。textarea 要素の focus イベントを拾って、現在ノードを記憶しる。

2   名前: 匿名 : 2007/04/13(金) 01:01  ID:5vHRQeeI sub-Cz
>>1
> 先に引数の evt を調べ

ごめん、これだとマズいな。IE も attachEvent 時にはハンドラの引数に EventObject を渡すから。まあ、NN4 や (Win/Mac)IE4-5 を相手にしないのなら、以下で十分だと思う。
if (document.implementation.hasFeature ('Events', '2.0')) {
    // Firefox, Opera, Safari
} else if (typeof window.event != 'undefined') {
    // IE
    // 実際には Opera と Safari も window.event を持つが、
    // わざわざ IE に合わせる必要はないので先に分岐させる
}

一覧へ戻る