« iモードブラウザ2.0のJavaScript | メイン | JSDeferredを読む »

ワンクリックでコナミコマンドを実行するKonamiCommander

インターネットを見ていて、コナミコマンドの入力が必要になった時、いちいちマウスから手を離してキーボードから「上上下下左右左右BA」するのは面倒ですよね。パソコンを使っているのですから、単調な作業や繰り返しする入力は自動化したいものです。そこで、コナミコマンドを入力するBookmarkletを作成しました。
/*
================================================================================
    Name        :   KonamiCommander Ver1.0.1
    In          :   [none]      
    Out         :   [none]      
    Note        :   コナミコマンドを入力するBookmarkletです。
--------------------------------------------------------------------------------
    Version     :   Ver1.0.0    |   2009/05/31  |   新規作成
                :   Ver1.0.1    |   2009/07/08  |   Safariに対応
--------------------------------------------------------------------------------
    License     :   MIT license
    URL         :   www.kanasansoft.com
================================================================================
*/

(
    function(){
        [38,38,40,40,37,39,37,39,66,65].forEach(
            function(keyCode){
                ["keydown","keypress","keyup"].forEach(
                    function(eventName){
                        var eve=document.createEvent("Events");
                        eve.initEvent(eventName,true,false,window,1);
                        eve.keyCode=keyCode;
                        document.body.dispatchEvent(eve);
                    }
                );
            }
        );
    }
)();
KonamiCommanderを導入し、アナタのインターネット生活をパワーアップしましょう。
説明
Firefoxでしか動作しないはずです。せめてSafari3で動作すればiPhoneやiPod touchからもコナミコマンドを入力できるようになったかもしれないのですが...。dispatchEventをbody要素でしているので、documentElementオブジェクトやwindowオブジェクトへaddEventListenerされていてもイベント伝播で対応できているはずです。
2009/07/08 追記
KonamiCommanderを修正しiPod touchとSafariで動くようになりました。iPhoneでも動作するはずです。Safariではどうも生成したイベントに関連づいたプロパティが初期化されてしまうようです。
KonamiCommander Ver1.0.0の処理概要
function f(e){
    alert(eve.keyCode);     //=>Firefox3の場合38,Safari4の場合0
    alert(eve.charCode);    //=>Firefox3の場合38,Safari4の場合0
    alert(eve.myCode);      //=>Firefox3の場合38,Safari4の場合38
}
document.body.addEventListener("keydown",f,false);

eve=document.createEvent("UIEvents");//UIEventでも動いた
eve.initUIEvent("keydown",true,false,window,1);
eve.keyCode=38;
eve.charCode=38;
eve.myCode=38;
document.body.dispatchEvent(eve);
イベントの初期化の例
//Firefox3では何故か動作しません
function f(e){
    alert(eve.keyCode);     //Safari4の場合0
    alert(eve.charCode);    //Safari4の場合0
    alert(eve.myCode);      //Safari4の場合38
}
document.body.addEventListener("keydown",f,false);

eve=document.createEvent("KeyboardEvents");//KeyboardEventでも動いた
eve.initKeyboardEvent("keydown",true,false,window,1);
eve.keyCode=38;
eve.charCode=38;
eve.myCode=38;
document.body.dispatchEvent(eve);
KonamiCommander Ver1.0.1の処理概要
function f(e){
    alert(eve.keyCode);     //=>Firefox3,Safari4共に38
    alert(eve.charCode);    //=>Firefox3,Safari4共に38
    alert(eve.myCode);      //=>Firefox3,Safari4共に38
}
document.body.addEventListener("keydown",f,false);

eve=document.createEvent("Events");//Eventでも動いた
eve.initEvent("keydown",true,false,window,1);
eve.keyCode=38;
eve.charCode=38;
eve.myCode=38;
document.body.dispatchEvent(eve);
イベント生成・初期化・発火のブラウザ間の互換性についてのまとまった情報が欲しいですね。
iPhone/iPod touchでBookmarkletを登録するには以下をご利用ください。

トラックバック

このエントリーのトラックバックURL:
http://www.kanasansoft.com/cgi/mt/mt-tb.cgi/232

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google