Container Family: Creating a Modal "Loading" Panel
Modal表示とは、ある一つの表示エリア以外を「触れないようにする」表示形態のことである。
よく、ログイン画面などで、ユーザーIDとパスワードの入力エリアのみを表示し、認証が行われるまで、バックグラウンドがグレイアウトすることがある。
これが、ログインエリアをモーダルとするModal表示の一つの例。
YUIでは、Panelのコンフィグ・パラメータにmodalであるかどうか、を指定することでModal表示が可能となる。
このExampleでは、デフォルトのスキンを使用している。まず、以下の初期画面をだす。
そして、Show Panelボタンで、Modal表示するPanelをScriptで生成して、そのコンテンツとして、処理待ちのイメージを表示する(下の図)。この間、サーバー側のプログラムをよんで、そのリターンをcallback関数がまっている。
サーバーからの戻りがあると、callback関数によってPanelが消えるようになっている。
Modalに表示するPanelエリアは、Markupによって記述できるので、一般には、
- Modalな入力エリア
- Modalな処理待ちエリア
と組み合わせるのが普通であろう。
以下にJavascriptを含むHTMLの全体をしめす。
ModalなPanelを生成する際には、PanelのZ軸を値を他より大きくとる必要があるが、これも、コンストラクタに指定するコンフィグ・パラメータの一つとして設定できる。
また、サンプリングでは、サーバー側には、3secだけsleepしたてから、アウトプットを返す簡単なプログラムを配した。
<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/utilities/utilities.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("example.container"); // YAHOO.example.containerにModalPanelを追加する。 YAHOO.example.container.ModalPanel = function() { var Event = YAHOO.util.Event; var Dom = YAHOO.util.Dom; var wait,content; var clickHandler = function(){ content = document.getElementById("content"); content.innerHTML = ""; // Panelは一回だけ生成する。 if (!wait) { wait = new YAHOO.widget.Panel("wait", { width: "240px", fixedcenter: true, close: false, draggable: false, // 一番上に出す。 zindex:4, // Modal指定。 modal: true, // showされるまでは見えない。 visible: false } ); wait.setHeader("Loading, please wait..."); wait.setBody('<img src="http://us.i1.yimg.com/us.yimg.com/i/us/per/gr/gp/rel_interstitial_loading.gif"/>'); wait.render(document.body); } // Show the Panel wait.show(); // Connect to our data source and load the data var conn = YAHOO.util.Connect.asyncRequest("GET", "ajax_yui_container_modal_loading.php", callback); }; var callback = { success : function(o) { content.innerHTML = o.responseText; content.style.visibility = "visible"; wait.hide(); }, failure : function(o) { content.innerHTML = o.responseText; content.style.visibility = "visible"; content.innerHTML = "CONNECTION FAILED!"; wait.hide(); } }; return{ init: function() { YAHOO.util.Event.on("panelbutton", "click", clickHandler); } }; }(); //DOMが完全にloadされたら、サンプルを初期化する。 YAHOO.util.Event.onDOMReady( //DomReadyイベントで発火するハンドラ YAHOO.example.container.ModalPanel.init, //ハンドラに渡すオブジェクト(関数) YAHOO.example.container.ModalPanel, //ハンドラは、上記のオブジェクトのスコープをもつ。 true ); </script> </HEAD> <BODY class="yui-skin-sam"> <div id="container"> <p> YAHOO.widget.Panelのサンプルです。<br/> 「Show Panel」ボタンで、modal表示になります。 </p> <button id="panelbutton">Show Panel</button> <div id="content"></div> </div> </BODY> </HTML>
以下が、PHPプログラムである。
<?php /* ajaxサンプル。 author ; t.odaka date ; 2008/11/24 */ $data = '通信成功'; // 3秒待つ ; responseが戻るまでの間、動画gifを出すデモのため。 sleep(3); // 出力 echo($data); ?>