Implementing Container Keyboard Shortcuts with KeyListener
このExampleではキーボードのリスナー(キーボードが押されるというイベントに反応するリスナー)を作成している。
このためには、YAHOO.util.KeyListenerを利用する。
KeyListenerをインスタンス化する際には、
var kl2 = new YAHOO.util.KeyListener( // document全体にわたって、key strokeをlistenする。 document, // ファンクションキー(ctrl,alt,shift)+keyの番号 { ctrl:true, keys:89 }, // keyを押されたときの挙動 { fn:panel1.show, scope:panel1, // scopeがpanelに移る。 correctScope:true } );
というようにコンストラクタに引数を与える。この時、第1引数は、documentのどの範囲(DOMの範囲)をListenするかを指定する。この例では、documentを指定して、ページの全ての範囲でのKeyアクションをListenするように指定している。
第2引数は、どのキーをListenするかをあらわしている。ctrl、alt、shiftのファンクションキーも指定できる。
(キー番号表:ActionScriptの解説なのはちょっと皮肉です)
第3引数は、Keyを押されたときのハンドラの指定と、ハンドラーが実行されるスコープ、スコープ(具体的にはthis)をそこに移すか、を指定する。
第4引数は、DefaultがKeydownとなっているKeyイベントを表す(上では指定していない)、添付のサンプルでは、ESCを使う際にKeyupを指定している。
サンプルでは、Ctrl+Yが押されると下の画面にあるようなパネルが表示され、ESCキーによってそれが消えるようになっている。
このとき以下の配慮がなされている。
- ESCキーのリスナーは、パネルが表示されたときにActiveになり、それが隠れた(消えた)ときにはinactiveになる。
- Ctrl+Yは、パネルの状態に関係なくActiveになる。
上を実現するためには、パネル(Panel)のkeylisteners属性にYAHOO.util.KeyListenerのインスタンスを入れる。
この方法は、Panelのサブクラスである、Dialog、SimpleDialogにも適用できる。
以下にJavascriptを含むHTMLの全文を示す。
<HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLE>Ajax_Sampling</TITLE> <style type="text/css"> body { margin:0; padding:0; } </style> <link rel="stylesheet" type="text/css" href="scripts/yui/fonts/fonts-min.css" /> <link rel="stylesheet" type="text/css" href="scripts/yui/container/assets/skins/sam/container.css" /> <script type="text/javascript" src="scripts/yui/yahoo-dom-event/yahoo-dom-event.js"></script> <script type="text/javascript" src="scripts/yui/dragdrop/dragdrop-min.js"></script> <script type="text/javascript" src="scripts/yui/container/container-min.js"></script> <style type="text/css" id="defaultstyle"> #container { margin: 2px; padding: 3px; width: 400px; height: auto; border:1px dashed #999999; } </style> <script type="text/javascript"> YAHOO.namespace("EGP"); YAHOO.EGP.KeyBoard = function() { var Event = YAHOO.util.Event; var panel1; return{ init: function() { // Build panel1 based on markup panel1 = new YAHOO.widget.Panel("panel1", { xy:[350,330], width:"250px", visible: false } ); // ESCはpanel1が表示されたときだけListenするようにする。(cfg.queueProperty("keylisteners", kl)) var kl = new YAHOO.util.KeyListener( // document全体にわたって、key strokeをlistenする。 document, // keyの番号 { keys:27 }, // keyを押されたときの挙動 { fn:panel1.hide, scope:panel1, // scopeがpanelに移る。 correctScope:true }, // keyイベント(default:keydown): Safariがkeydownを認識しないため "keyup" ); panel1.cfg.queueProperty("keylisteners", kl); panel1.render(); // Ctrl+Yはpanelの表示に関わらずlistenするようにする。 var kl2 = new YAHOO.util.KeyListener( // document全体にわたって、key strokeをlistenする。 document, // ファンクションキー(ctrl,alt,shift)+keyの番号 { ctrl:true, keys:89 }, // keyを押されたときの挙動 { fn:panel1.show, scope:panel1, // scopeがpanelに移る。 correctScope:true } ); kl2.enable(); Event.addListener("show", "click", panel1.show, panel1, true); Event.addListener("hide", "click", panel1.hide, panel1, true); } }; }(); YAHOO.util.Event.onDOMReady( //DomReadyイベントで発火するハンドラ YAHOO.EGP.KeyBoard.init, //ハンドラに渡すオブジェクト(関数) YAHOO.EGP.KeyBoard, //ハンドラは、上記のオブジェクトのスコープをもつ。 true ); </script> </HEAD> <BODY class="yui-skin-sam"> <div id="container"> <p> Key Pressをlistenするサンプルです。 </p> <div> panel1: <button id="show">Show (Ctrl+Y)</button> <button id="hide">Hide (Esc)</button> </div> <div id="panel1" style="visibility:hidden"> <div class="hd">KeyをListenするサンプルです</div> <div class="bd">パネルを消すには [ESC] を押してください</div> </div> </div> </BODY> </HTML>