DTDの指定をすると機能しない

[新着] TAG indexオフライン版 3.0 を準備中です



0   名前: 初心者です : 2007/03/29(木) 13:08  ID:ilm9hxpk sub-Ar
ちょっと行き詰まってます。
よろしくお願いします。

【現在の状況】
右クリック禁止、ショートカットキー禁止のJavaScriptを作成し、
HTMLで呼び出して使っています。
DOCTYPEのdtdの指定を記述すると、IEでうまく動作しません。

【どうしたいのか】
DOCTYPEのDTDの指定を記述した状態で、IEで動作させたい。
無理なら、あきらめます。

【何をしたのか】
現在のソースです。
ファイルは、3つに分けています。
「func.html」、「rClick.js」、「fncKey.js」です。

「func.html」
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-31J">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>ショートカット、右クリック制御の例</title>
<script type="text/javascript" src="fncKey.js"></script>
<script type="text/javascript" src="rClick.js"></script>
</head>
<body onkeydown="return fncKey()" oncontextmenu="return fncRclick()">
<h1>ショートカットキー・右クリックを制御する。</h1>
<br>
<br>
テキストボックス・パスワードボックスにカーソルが当たっているときは、BackSpace有効<br>
名前:<input type="text" size="10" maxlength="10" >
<br>
パスワード:<input type="password" size="10" maxlength="10" >
</body>
</html>



「rClick.js」
function fncRclick(){
alert('右クリックは禁止です。');
return false;
}



「fncKey.js」
function fncKeySet(alt,keyCd,textEdit){
this.alt = alt;
this.keyCd = keyCd;
this.textEdit = textEdit;
}

var keys = new Array();
// 抑止したいキーの組み合わせをセット
keys[keys.length] = new fncKeySet(false,8,false); //バックスペース
keys[keys.length] = new fncKeySet(true,8,false);
keys[keys.length] = new fncKeySet(true,37,false); //←ボタン
keys[keys.length] = new fncKeySet(true,37,true);
keys[keys.length] = new fncKeySet(true,39,false); //→ボタン
keys[keys.length] = new fncKeySet(true,39,true);
keys[keys.length] = new fncKeySet(true,36,true); //HOMEキー
keys[keys.length] = new fncKeySet(true,36,false);
//制御したいキーをセット(Ctrl+キー)
var key = new Array();
key[key.length] = 78; //「N」キー(新規ウィンドウの表示)
key[key.length] = 83; //「S」キー(保存する)
key[key.length] = 76; //「L」キー(ファイルを開く)
key[key.length] = 72; //「H」キー(履歴を表示)
key[key.length] = 69; //「E」キー(検索を表示)
key[key.length] = 73; //「I」キー(お気に入りを表示)
key[key.length] = 68; //「D」キー(お気に入りに追加)
key[key.length] = 66; //「B」キー(お気に入りの整理を表示)

function fncKey(){
//イベントが発生した要素を示すオブジェクトを返す
var elm = event.srcElement;
//Altキーが押されているときtrue、押されていないときfalseを返す
var alt = event.altKey;
//Ctrlキーが押されているときtrue、押されていないときfalseを返す
var ctrl = event.ctrlKey;
//押されているキーのコードを返す
var keyCd = event.keyCode;
//イベント発生時に、テキストボックスまたはパスワードボックスが選択されているときtrue、それ以外はfalse
var textEdit = (elm.tagName == "INPUT" && elm.type == 'text') || (elm.tagName == "INPUT" && elm.type == 'password');

//禁止の組み合わせの種類の数だけループ
for(var i = 0; i < keys.length; ++i){
//イベント発生時の組み合わせが、禁止の組み合わせと一致するか判定
if(keys[i].alt == alt && keys[i].keyCd == keyCd && keys[i].textEdit == textEdit){
if( !(alt && keyCd == 8) ) {
alert("コマンドでの画面移動は禁止されています。");
return false;
}
}
}

//Ctrlキーが押下されたとき
if(ctrl == true){
for(var i = 0; i < key.length; ++i){
if(key[i] == keyCd ){
alert("コマンドでの動作は禁止されています。");
return false;
}
}
}
return true;
}


【備考】
Firefoxでは、DTDの指定をしても動作確認済みです。
ただし、DTDの指定をしてもしなくても、ショートカットキーの制御ができません。

1   名前: 匿名 : 2007/03/29(木) 13:08  ID:6fAvcTJO sub-kJ
IE 独自拡張(IE Event Model)を使っているから、Firefox で動作しないのは当然。

また、IE 標準モードで MouseEvent/KeyEvent を取得する場合は、body 要素ではなく html 要素で。



ちなみに、どのくらいの信頼性を考えてるの?

・ショートカットキーなんて設定でいくらでも変更できるし、
・ツールバー→保存だって可能だし(今どきはツールバーを消さないように設定できる)、
・ブックマークレット一発でスクリプト自体を無効にできる。

ゲームや独自 UI の Web アプリを作るならともかく、単なるフォーム入力用(誤操作を避けるためのもの?)としては、労力の割に成果を期待できないと思う。むしろ、コンテキストメニューまで制限されては、かえって入力に不便(ソフトウェアキーボードまで用意してくれるのならともかく)。

2   名前: 初心者です : 2007/03/29(木) 13:08  ID:ilm9hxpk sub-Ar
早速の解答、ありがとうございます。
とても親切に書いていただき、大変勉強になりました。
ありがとうございました。

一覧へ戻る