DataTable Control: Context Menu Integration
これもAjaxらしい、触って楽しいExampleとなっている。
テーブルのある行にカーソルを合わせて、右クリックすると、OSライクなメニュー(コンテキスト・メニュー;Context Menu)が表示される。
この例では、その行を削除することのみが選択できる(下の図;これを拡張することは簡単。以前の「Menu Family: Context Menu」を参照)。
ここで消すを選択すると、以下のような、確認画面(Confirm Box)が上がって(ちゃんと、消すデータの中身を取ってきていることに注目)、OKとするとDataTableから行が削除される。
このサンプルのポイントは、コンテキストメニューの表示をDataTableのTBodyに設定していることだけで、これはContextMenuのコンフィグ属性(trigger)で指定できる(YAHOO.widget.ContextMenuのAPIドキュメントはこちら)。
イベントハンドラーは先の「Menu Family: Context Menu」と殆ど同じとなっている。
以下にJavascriptを含むHTMLの全文を示す。
このサンプルは、このまま、実際の利用局面(本当のデータの消去など)に拡張できるので、注釈をつけるだけで殆ど手を入れなかった。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Ajax Sample</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/menu/assets/skins/sam/menu.css" /> <link rel="stylesheet" type="text/css" href="scripts/yui/datatable/assets/skins/sam/datatable.css" /> <script type="text/javascript" src="scripts/yui/yahoo-dom-event/yahoo-dom-event.js"></script> <script type="text/javascript" src="scripts/yui/container/container_core-min.js"></script> <script type="text/javascript" src="scripts/yui/menu/menu-min.js"></script> <script type="text/javascript" src="scripts/yui/element/element-beta-min.js"></script> <script type="text/javascript" src="scripts/yui/datasource/datasource-min.js"></script> <script type="text/javascript" src="scripts/yui/datatable/datatable-min.js"></script> <style type="text/css" id="defaultstyle"> #main { margin: 2px; padding: 3px; } div.yuimenu .bd { zoom: normal; } </style> <script type="text/javascript" src="scripts/yui/datatable/assets/js/data.js"></script> <script type="text/javascript"> YAHOO.util.Event.addListener(window, "load", function() { YAHOO.example.ContextMenu = function() { // 列定義 var myColumnDefs = [ {key:"SKU", sortable:true}, {key:"Quantity", sortable:true}, {key:"Item", sortable:true}, {key:"Description"} ]; var myDataSource = new YAHOO.util.DataSource(YAHOO.example.Data.inventory); myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY; myDataSource.responseSchema = { fields: ["SKU","Quantity","Item","Description"] }; var myDataTable = new YAHOO.widget.DataTable("myContainer", myColumnDefs, myDataSource); // コンテキストメニュークリック時の処理(イベントハンドラー) var onContextMenuClick = function(p_sType, p_aArgs, p_myDataTable) { // p_aArgs[1]はクリックされたMenuItem var task = p_aArgs[1]; if(task) { // コンテキストメニューが表示された行のTR要素を抜き出す。(※1) var elRow = this.contextEventTarget; elRow = p_myDataTable.getTrEl(elRow); if(elRow) { // MenuItemは「delete」の1つしかないので、task.indexは0だけ。 switch(task.index) { case 0: // Delete row upon confirmation var oRecord = p_myDataTable.getRecord(elRow); if(confirm("SKU " + oRecord.getData("SKU") + " (" + oRecord.getData("Description") + ") を消去しますがよろしいですか?")) { // ※1で求めたTRエレメントをもとに、DataTableからデータ列を消去する。 p_myDataTable.deleteRow(elRow); } } } } }; var myContextMenu = new YAHOO.widget.ContextMenu("mycontextmenu", // コンテキストメニューが現れるHTMLエレメントをDataTableのTBodyに設定。 {trigger:myDataTable.getTbodyEl()} ); myContextMenu.addItem("Delete Item"); // Render the ContextMenu instance to the parent container of the DataTable myContextMenu.render("myContainer"); myContextMenu.clickEvent.subscribe(onContextMenuClick, myDataTable); return { oDS: myDataSource, oDT: myDataTable }; }(); }); </script> </head> <body class=" yui-skin-sam"> <div id="main"> <p>右クリックすると行を消すメニュー(コンテキストメニュー)が現れます</p> <div id="myContainer"></div> </div> </body> </html>