Webページ上でのマウスクリックやキー押下イベントを制御します。

*** HIDEventControl.js [#s954881f]
- テキスト入力エレメント以外では、コンテキストメニューを非表示。
- マウスクリック制御のスケルトンを提供。(必要に応じて処理追記されたし)
- ブラウザショートカットキーの無効化制御。

- 本体 : &ref(http://jomura.net/archive/2010/HIDEventControl.js);
- 本体(min) : &ref(http://jomura.net/archive/2010/HIDEventControl.min.js);
 ///////////////////////////////////////////////////////////
 //                                                         
 // Human Interface Device Event Control                    
 //                                                         
 // Copyright 2009- TOKYO GAS CO.,LTD. All Rights Reserved. 
 //                                                         
 // @author K.Jomura                                        
 // @author $LastChangedBy$                                 
 // @since 2009.09.16                                       
 // @version 2010.04.02 enable to use on frame
 //
 // Human Interface Device Event Control
 //
 // @author K.Jomura ( kazuhiko@jomura.net http://jomura.net/ )
 // @author $LastChangedBy$
 // @since 2009.09.16
 // @version 2010.08.13 lighten
 //          2010.04.02 enable to use on frame
 //          2010.03.12 Disabled [Space]Key
 //          2009.10.05 version 1                                                                            //
 ///////////////////////////////////////////////////////////
 
 /*
  * 必要に応じて本ファイルの内容をcommon.js等に取り込んでください。
  */
 
 /*
  * コンテキストメニュー制御スクリプト
  */
 //bodyオブジェクトはload後でないと取得できないため、loadイベントでセットする
 addEvent(window, "load", set_oncontextmenu);
 function set_oncontextmenu() {
 	var bodys = document.getElementsByTagName("body");
 	if (bodys.length != 1) {
 		return;
 	}
 	var body = bodys[0];
 	if ('\v' == 'v') {
 		body.oncontextmenu = enableContextMenu; // for IE
 	} else {
 		body.setAttribute("oncontextmenu",
 				"return enableContextMenu();"); // forFirefox
 	}
 }
 function enableContextMenu() {
 	var obj = document.activeElement;
 	// フォーカスが当たっていない場合は無効化
 	if (obj != null) {
 		// TEXTAREAの場合は、標準動作
 		if (obj.tagName.toUpperCase() == 'TEXTAREA') {
 			if (!obj.readOnly) {
 				return true;
 			}
 		}
 		// INPUTで、typeがTEXTかPASSWORDの場合は、標準動作
 		if (obj.tagName.toUpperCase() == 'INPUT'
 	if (obj != null && obj.type != null) {
 		// TEXTAREAもしくはINPUTでtypeがTEXTかPASSWORDの場合は、標準動作
 		if (obj.tagName.toUpperCase() == 'TEXTAREA'
 			|| (obj.tagName.toUpperCase() == 'INPUT'
 				&& (obj.type.toUpperCase() == 'TEXT'
 					|| obj.type.toUpperCase() == 'PASSWORD')) {
 					|| obj.type.toUpperCase() == 'PASSWORD'))) {
 			if (!obj.readOnly) {
 				return true;
 			}
 		}
 	}
 	return false;
 }
 
 /*
  * マウスクリック制御スクリプト
  */
 /*
 // 画面でマウスがクリックされた時のイベントハンドラー
 addEvent(document, "mousedown", mouseHook);
 addEvent(document, "mouseup", mouseHook);
 function mouseHook(e) {
 	var _event;
 	if ('\v' == 'v') {
 		_event = event; // for IE
 	} else {
 		_event = e; // for Firefox
 	}
 
 	// クリックされたタイミングでフォーカスされたエレメントの取得
 	var obj = document.activeElement;
 
 	if (_event.button & 2) // 右クリック
 	{
 		// 無効化
 		// return disableMouseEvent(_event);
 	}
 
 	// ブラウザ標準の動作
 	return true;
 
 	// マウスイベントを無効化する。
 	function disableMouseEvent(_event) {
 		_event.cancelBubble = true; // イベントの通知を禁止
 		alert('右クリックメニューは使用できません。'); // 右クリックメニューを防止する為に必須
 		return false; // その他イベントを禁止
 	}
 }
 */
 
 /*
  * キー制御スクリプト
  */
 // bodyオブジェクトはload後でないと取得できないため、loadイベントでセットする
 addEvent(window, "load", set_onkeydown);
 function set_onkeydown() {
 	if ('\v' == 'v') {
 		addEvent(document.body, "keydown", keyHook); // for IE
 	} else {
 		document.onkeydown = keyHook; // for Firefox
 	}
 }
 function keyHook(e) {
 	var _event;
 	if ('\v' == 'v') {
 		_event = event; // for IE
 	} else {
 		_event = e; // for Firefox
 	}
 
 	// キーが押されたタイミングでフォーカスされたエレメントの取得
 	var obj = document.activeElement;
 
 	// 以下、キー毎に処理を行う
 	// Alt + F4 ,ESCについてはJavaScriptでの防止は不可。
 
 	// Ctrlキー
 	if (_event.ctrlKey) {
 		switch (_event.keyCode) {
 		case 66: // Ctrl + B 標準動作:[お気に入りの整理] ダイアログ ボックを表示する。
 		case 68: // Ctrl + D 標準動作:現在のページを[お気に入り]に追加する
 		case 69: // Ctrl + E 標準動作:検索バーを表示する。
 		case 72: // Ctrl + H 標準動作:履歴バーを表示する。
 		case 73: // Ctrl + I 標準動作:お気に入りバーを表示する。
 		case 76: // Ctrl + L 標準動作:新しくファイルを開く。
 		case 78: // Ctrl + N 標準動作:新しいウィンドウを表示する。
 		case 79: // Ctrl + O 標準動作:新しくファイルを開く。
 		case 82: // Ctrl + R 標準動作:現在の Web ページを更新する。
 		case 83: // Ctrl + S 標準動作:現在のページを保存する。※未反応だが念の為に
 		case 87: // Ctrl + W 標準動作:現在のウィンドウを閉じる。
 			return disableKeyEvent(_event);
 		}
 	}
 
 	// Altキー
 	if (_event.altKey) {
 		switch (_event.keyCode) {
 		case 36: // Alt + Home 標準動作:ホーム ページに移動する。
 		case 37: // Alt + ← (左矢印) 標準動作:前のページに移動する。
 		case 39: // Alt + → (右矢印) 標準動作:次のページに移動する。
 			disableKeyEvent(_event);
 			if ('\v' == 'v') {
 				// IEはメッセージ表示をしないと無効化できない
 				disableKeyEventAlert();
 			}
 			return false;
 		}
 	}
 
 	switch (_event.keyCode) {
 	case 8:
 		// BackSpaceキー
 		// 標準動作:前のページに移動する。
 
 		// コントロールのタイプが取得できない場合にはアクションを起こさない
 		if (obj != null && obj.type != null) {
 			// TEXTAREAの場合は、標準動作
 			if (obj.tagName.toUpperCase() == 'TEXTAREA') {
 			// TEXTAREAもしくはINPUTでtypeがTEXTかPASSWORDの場合は、標準動作
 			if (obj.tagName.toUpperCase() == 'TEXTAREA'
 				|| (obj.tagName.toUpperCase() == 'INPUT'
 					&& (obj.type.toUpperCase() == 'TEXT'
 						|| obj.type.toUpperCase() == 'PASSWORD'))) {
 				if (!obj.readOnly) {
 					return true;
 				}
 			}
 
 			// INPUTで、typeがTEXTかPASSWORDの場合は、標準動作
 			if (obj.tagName.toUpperCase() == 'INPUT'
 					&& (obj.type.toUpperCase() == 'TEXT' || obj.type
 							.toUpperCase() == 'PASSWORD')) {
 				if (!obj.readOnly) {
 					return true;
 				}
 			}
 		}
 		return disableKeyEvent(_event);
 		break;
 
 	case 32:
 		// Spaceキー
 		// 標準動作:様々
 
 		// コントロールのタイプが取得できない場合にはアクションを起こさない
 		if (obj != null && obj.type != null) {
 			// TEXTAREAの場合は、標準動作
 			if (obj.tagName.toUpperCase() == 'TEXTAREA') {
 				if (!obj.readOnly) {
 					return true;
 				}
 			}
 
 			// INPUTで、typeがTEXTかPASSWORDの場合は、標準動作
 			if (obj.tagName.toUpperCase() == 'INPUT'
 			// TEXTAREAもしくはINPUTでtypeがTEXT,PASSWORD,CHECKBOX,RADIOの
 			//  いずれかの場合は、標準動作
 			if (obj.tagName.toUpperCase() == 'TEXTAREA'
 				|| (obj.tagName.toUpperCase() == 'INPUT'
 					&& (obj.type.toUpperCase() == 'TEXT'
 							|| obj.type.toUpperCase() == 'PASSWORD'
 							|| obj.type.toUpperCase() == 'CHECKBOX' 
 							|| obj.type.toUpperCase() == 'RADIO')) {
 							|| obj.type.toUpperCase() == 'RADIO'))) {
 				if (!obj.readOnly) {
 					return true;
 				}
 			}
 		}
 		return disableKeyEvent(_event);
 		break;
 
 	case 13:
 		// Enterキー
 		// 標準動作:様々
 
 		// Do Nothing
 		break;
 
 	case 93:
 		// ContextMenuキー
 		// 標準動作:コンテキストメニューを表示する。
 
 		// Do Nothing
 		// body.oncontextmenuで制御するため、キー制御は不要。
 		break;
 
 	// ファンクションキー等
 	// ヘルプ表示以外のすべてのファンクションキーを無効化
 	case 113: // F2 標準動作:なし
 	case 114: // F3 標準動作:Googleツールバーの表示。
 	case 115: // F4 標準動作:以前入力したアドレスの一覧を表示する。
 	case 116: // F5 標準動作:(Ctrl + F5)現在のページを更新する。
 	case 117: // F6 標準動作:なし
 	case 118: // F7 標準動作:なし
 	case 119: // F8 標準動作:なし
 	case 120: // F9 標準動作:なし
 	case 121: // F10 標準動作:(Shift + F10)リンクのショートカット(右クリック)メニュを表示する。
 	case 122: // F11 標準動作:ブラウザ ウィンドウの全画面表示と通常表示を切替える。
 	case 123: // F12 標準動作:?
 	case 124: // F13 標準動作:?
 	case 125: // F14 標準動作:?
 	case 126: // F15 標準動作:?
 	case 127: // F16 標準動作:?
 
 	case 166: // ThinkPadの「戻る」 ※効かない
 	case 167: // ThinkPadの「進む」 ※効かない
 		return disableKeyEvent(_event);
 	}
 
 	// ブラウザ標準の動作
 	return true;
 
 	// キーイベントを無効化する。
 	function disableKeyEvent(_event) {
 		if ('\v' == 'v') {
 			_event.keyCode = -1; // キーコードを無効化 (Firefoxにはsetter無し=IE専用?)
 		}
 		_event.cancelBubble = true; // イベントの通知を禁止
 		_event.returnValue = false;
 		return false;
 	}
 
 	// メッセージを表示してイベント処理実行を防止する。
 	function disableKeyEventAlert() {
 		alert("このショートカットキーは使用できません。");
 	}
 }
 
 function addEvent(elem, eventType, fn) {
 	if (elem.addEventListener) { // for W3C DOM
 		elem.addEventListener(eventType, fn, false);
 	} else if (elem.attachEvent) { // for IE
 		elem.attachEvent('on' + eventType, fn);
 	} else {
 		elem['on' + eventType] = fn;
 	}
 }

- テスト用HTML : &ref(HIDEventControlTest.html);

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS