Last-modified: 2010-08-13 (金) 13:07:33 (3407d)

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

HIDEventControl.js

  • テキスト入力エレメント以外では、コンテキストメニューを非表示。
  • マウスクリック制御のスケルトンを提供。(必要に応じて処理追記されたし)
  • ブラウザショートカットキーの無効化制御。
  • 本体 : fileHIDEventControl.js
  • 本体(min) : fileHIDEventControl.min.js
    ///////////////////////////////////////////////////////////
    //
    // 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 && 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'))) {
    			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もしくは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;
    				}
    			}
    		}
    		return disableKeyEvent(_event);
    		break;
    
    	case 32:
    		// Spaceキー
    		// 標準動作:様々
    
    		// コントロールのタイプが取得できない場合にはアクションを起こさない
    		if (obj != null && obj.type != null) {
    			// INPUTで、typeがTEXTかPASSWORDの場合は、標準動作
    			// 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'))) {
    				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;
    	}
    }

添付ファイル: fileHIDEventControlTest.html 2372件 [詳細]

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