2008-12-02
Implementing Container Keyboard Shortcuts with KeyListener
Ajax, Javascript, YUI, Container, Panel | |
![]()
この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>
- 4 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=Ldj&q=linkbutton+javascript&btnG=検索&lr=lang_ja
- 3 http://www.google.co.jp/search?hl=ja&client=firefox&rls=org.mozilla:ja:official&hs=wq3&q=javascript+button+style&btnG=検索&lr=lang_ja
- 3 http://www.google.co.jp/search?hl=ja&client=firefox-a&channel=s&rls=org.mozilla:ja:official&hs=rxf&q=YUI+カレンダー 表示 ボタン&btnG=検索&lr=
- 2 http://rss.4649.st/?k=JavaScript
- 2 http://search.yahoo.co.jp/search?p=css+li+treeview+checkbox&ei=UTF-8&fr=moz2&rls=org.mozilla:ja-JP:official
- 2 http://search.yahoo.co.jp/search?p=tree+checkbox+css+javascript+ajax&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8
- 2 http://www.google.com/search?hl=ja&client=safari&rls=en&q=javascript+button+input+type+post&btnG=検索&lr=
- 1 http://categola.net/comp/prog/javascript.html
- 1 http://d.hatena.ne.jp/diarylist?of=0&mode=rss&type=public
- 1 http://d.hatena.ne.jp/keyword/ツールチップ

