YUI2.7.0+PHP5でメニューを自作する(その2)
先日のログのプログラムを発展させて、
- 単純なツリー形式にする。
- 画面にオーバーレイして出現する。
ようにしてみた。
以下は、初期画面のスナップショット。
「Menu」とあるリンクをクリックすると、YUIのAnimを使って、下のようにツリー状のメニューが浮かび上がってくる(このサンプルではやっていないが、絶対位置を指定することで、下の画面に乗っかって表示させることができる)。
「Close」とあるリンクをクリックすると、(これも)YUIのAnimを使って、ゆっくりとメニューが消える。先のログから修正したプログラムは、Javascriptを含むHTMLだけ。
ただし、YUI2.7.0のTreeViewのイベントハンドルが怪しいので(このログを参照方)、YUI2.6.0のtreeview.jsを使用した。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT"> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>Menu</title> <link rel="stylesheet" type="text/css" href="../scripts/lib/yui/build/fonts/fonts-min.css" /> <link rel="stylesheet" type="text/css" href="../scripts/lib/yui/build/treeview/assets/skins/sam/treeview.css" /> <script type="text/javascript" src="../scripts/lib/yui/build/yahoo-dom-event/yahoo-dom-event.js"></script> <script type="text/javascript" src="../scripts/lib/yui/build/connection/connection-min.js" ></script> <script type="text/javascript" src="../scripts/lib/yui/build/treeview/treeview-min.js" ></script> <script type="text/javascript" src="../scripts/lib/yui/build/animation/animation-min.js" ></script> <style type="text/css" id="defaultstyle"> #main { margin: 2px; padding: 3px; } .ez_error { /* red(エラー用) */ color:#ff0000; } /* 「Close」リンク用枠とtreeの枠を収める箱 */ #menuReg { margin: 5px; position: relative; width: 350px; height: auto; opacity: 0; background: #FFFFFF; padding:1em; z-index: 2; border:2px solid #C0FF3E; visibility: hidden; } /* 「Close」リンク用枠 */ #closelink { margin: 2px; position: relative; width: 340px; height: auto; background: transparent; padding:0.5em; z-index: 2; } /* treeをレンダリングする枠 */ #treeDiv1 { margin: 2px; position: relative; width: 340px; height: auto; background: transparent; padding:0.5em; z-index: 2; } /*リンク(メニュー)*/ #lnk1.lnk { visibility: visible; } /*擬似リンク(閉じる)*/ #lnk2.lnk { visibility: hidden; } </style> <script type="text/javascript"> DisplayMenu = function() { var Event = YAHOO.util.Event; var Dom = YAHOO.util.Dom; var Connect = YAHOO.util.Connect; var TreeView = YAHOO.widget.TreeView; var Anim = YAHOO.util.Anim; var tree; /* * メニューリンクをクリックしたときのハンドラ */ var menuClickHdlr = function(_evt){ Event.preventDefault(_evt); // メッセージのクリア Dom.get('msg').innerHTML = ''; Dom.get('treeDiv1').innerHTML = ''; var _url = 'getMenu1.php'; var _arg ={ 'errId' : 'msg', 'resId' : 'treeDiv1' }; menuCallback.argument = _arg; // ajaxで検証 YAHOO.util.Connect.asyncRequest('POST',_url, menuCallback); } /* * メニュー取得時のコールバック */ var menuCallback = { success : function(_obj) { var _resId = _obj.argument.resId; var _errId = _obj.argument.errId; // XHRの戻り値の取得(メニュー文字列) var _ret = _obj.responseText; // メニューの表示 if(_ret.length > 0){ Dom.get(_resId).innerHTML = _ret; Event.onAvailable(_resId , function(){ //Treeのインスタンス化: _tree = new TreeView(_resId); _tree.render(); } ); // Animation Dom.setStyle('lnk1','visibility','hidden'); var attributes = { opacity: { to: 0.9 } }; // Animオブジェクトのインスタンス化 var anim = new Anim('menuReg', attributes, 1,YAHOO.util.Easing.backIn); anim.animate(); Dom.setStyle('menuReg','visibility','visible'); Dom.setStyle('lnk2','visibility','visible'); }else{ // エラーのハンドル(皆さん適当に) Dom.get(_errId).innerHTML = 'メニューの取得に失敗しました.'; } }, failure : function(_obj) { var _errId = _obj.argument.errId; var _ret = 'ステータス: ' + _obj.status + 'ステータステキスト: ' + _obj.statusText + ' メニューの取得に失敗しました。'; // エラーのハンドル(皆さん適当に) Dom.get(_errId).innerHTML = _ret; } }; /* * メニュークローズをクリックしたときのハンドラ */ var menuCloseHdlr = function(_evt){ Event.preventDefault(_evt); // Animation Dom.setStyle('lnk1','visibility','visible'); Dom.setStyle('lnk2','visibility','hidden'); var attributes = { opacity: { to: 0 } }; // Animオブジェクトのインスタンス化 var anim = new Anim('menuReg', attributes, 1,YAHOO.util.Easing.backIn); anim.animate(); }; return{ init: function() { // メニューのハンドラー Event.on('lnk1', 'click', menuClickHdlr); // メニュー・クローズのハンドラー Event.on('lnk2', 'click', menuCloseHdlr); }, // initの終わり }; }(); //DOMが完全にloadされたら、サンプルを初期化する。 YAHOO.util.Event.onDOMReady( //DomReadyイベントで発火するハンドラ DisplayMenu.init, //ハンドラに渡すオブジェクト DisplayMenu, //ハンドラは、上記のオブジェクトのスコープをもつ。 true ); </script> </HEAD> <BODY class="yui-skin-sam"> test_menu2.html <br> <div id="container"> <p> ユーザーのロールに基づいてMenuを取得するサンプルです。<br/> </p> <a id="lnk1" href="#" class="lnk">Menu</a> <div id="msg" class=".ez_error"></div> <!-- メニュー表示のためのマークアップ --> <div id = 'menuReg'> <div id="closelink"> <a id="lnk2" href="#" class="lnk">Close</a> </div> <div id='treeDiv1'></div> </div> </div> </BODY> </HTML>