Button Control: Split Buttons

Split Button(分かれたボタン)というのは、聞きなれない呼称なので、現物を見た方が早い。
YUIのExampleのページへのリンクはこちら

以下がサンプルの画面であるが、青の4角で囲んだ部分をクリックするとMenuが展開され、ボタン内の以外の場所をクリックしてもMenuは現れない。
これをして、Split(分かれた)と呼んでいる。

このようなSplit Buttonは、先の「Menu Button」を作るのとほぼ同じ要領で作ることができる。

以下にJavaScriptを含むhtmlの全文を示すが、これは、「Menu Button」のhtmlにある「Menu(もしくは、menu)」を「Split(もしくは、split)」で置き換えただけのものである。

<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/button/assets/skins/sam/button.css" />
<link rel="stylesheet" type="text/css" href="scripts/yui/menu/assets/skins/sam/menu.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/button/button-min.js"></script>

<style type="text/css" id="defaultstyle">
#container {
	margin: 2px;
	padding: 3px;
	width: 500px;
	height: auto;
	border:1px dashed #999999;
}

/*
    Set the "zoom" property to "normal" since it is set to "1" by the 
   ".example-container .bd" rule in yui.css and this causes a Menu
    instance's width to expand to 100% of the browser viewport.
*/
    
div.yuimenu .bd {
	zoom: normal;
}

#button-example-form fieldset {
	border: 2px groove #ccc;
	margin: .5em;
	padding: .5em;
}

#splitbutton3menu,
#splitbutton5menu {
	position: absolute;
	visibility: hidden;
	border: solid 1px #000;
	padding: .5em;
	background-color: #ccc;
}

#button-example-form-postdata {
	border: dashed 1px #666;
	background-color: #ccc;
	padding: 1em;
}

#button-example-form-postdata h2 {
	margin: 0 0 .5em 0;
	padding: 0;
	border: none;
}

</style>

<script type="text/javascript">
//
//モジュールパターンで実装する。
//
YAHOO.namespace("EGP");

YAHOO.EGP.SplitButton = function() {

	var Dom = YAHOO.util.Dom;

    // SplitButton1は(input type="submit"から生成されるので)submitイベントを出す
    var onExampleSubmit = function (p_oEvent) {
        var bSubmit = window.confirm("Are you sure you want to submit this form?");
        if(!bSubmit) {
            YAHOO.util.Event.preventDefault(p_oEvent);
        }
    };
	
	return{
    	init: function() {

	// ---- buttonをタグから生成する。-----
		
            // Create a Button using an existing <input> element as a data source

        	// ----------- split button1の処理 --------------------
		    // SplitButton1は(input type="submit"から生成されるので)submitイベントを出す
            var oSplitButton1 = new YAHOO.widget.Button("splitbutton1", 
                    { 	type: "split", 
                		menu: "splitbutton1select" });

        	// ----------- split button2の処理 --------------------
            var oSplitButton2 = new YAHOO.widget.Button("splitbutton2", 
                    { 	type: "split", 
                		menu: "splitbutton2select" });

        	// ----------- split button3の処理 --------------------
            var oSplitButton3 = new YAHOO.widget.Button("splitbutton3", 
                    { 	type: "split", 
                		menu: "splitbutton3menu" });

	// ---- buttonをmarkupなしで生成する。-----

        	// ----------- split button4の処理 --------------------
			// SplitButton4のためのオブジェクトリテラル(Menuを定義するときと同じ)

			// SplitButton4のためのイベントハンドラ
		    function onSplitItemClick(p_sType, p_aArgs, p_oItem) {
		        oSplitButton4.set("label", p_oItem.cfg.getProperty("text"));
		    };

		    var aSplitButton4Menu = [
				{ text: "one", value: 1, onclick: { fn: onSplitItemClick } },
				{ text: "two", value: 2, onclick: { fn: onSplitItemClick } },
				{ text: "three", value: 3, onclick: { fn: onSplitItemClick } }
                ];

	        var oSplitButton4 = new YAHOO.widget.Button(
                { 	type: "split", 
                    label: "one", 
                    name: "mysplitbutton", 
                    menu: aSplitButton4Menu, 
                    container: "splitbuttonsfromjavascript" 
                }
        	);

        	// ----------- menu button5の処理 --------------------
        	// 4の処理が終わったら動くようにする。
        	// 待たないと、4より前に表示されてしまう。
	        YAHOO.util.Event.onContentReady("splitbuttonsfromjavascript", 
	    	        function () {
		        
				// Instantiate an Overlay instance
    	        var oOverlay = new YAHOO.widget.Overlay("splitbutton5menu", 
        	            { visible: false }
            	);
            	// Split Menuの中身をセット(カレンダーやカラーピッカーなど入れられる)
            	oOverlay.setBody("Split Button 5 Menu");
        
            	// Instantiate a Menu Button
            	var oSplitButton5 = new YAHOO.widget.Button(
                    { 	type: "split", 
                        label: "Split Button 5", 
                        menu: oOverlay 
                    }
            	);
            
            	/*
                 Append the Menu Button and Overlay to the element with the id 
                 of "menubuttonsfromjavascript"
            	*/
				var el = Dom.get('splitbuttonsfromjavascript');
            	oSplitButton5.appendTo(el);
            	oOverlay.render(el);

	    	});
        	// ----------- menu button5の処理 (end)--------------------
	    	
            // SplitButton1は(input type="submit"から生成されるので)submitイベントを出す
            // (そのハンドラを仕込む)。
            YAHOO.util.Event.on("button-example-form", 
                    "submit", onExampleSubmit);
		}
	};
}();

//DOMが完全にloadされたら、サンプルを初期化する。
YAHOO.util.Event.onDOMReady(
		//DomReadyイベントで発火するハンドラ
		YAHOO.EGP.SplitButton.init,
		//ハンドラに渡すオブジェクト(関数)
		YAHOO.EGP.SplitButton,
		//ハンドラは、上記のオブジェクトのスコープをもつ。   
		true
);

</script>
</HEAD>

<BODY class="yui-skin-sam">
<div id="container">
<p>
Split Buttonの作り方のサンプルです。
</p>
<form id="button-example-form" name="button-example-form" method="post">

    <fieldset id="splitbuttons">
        <legend>Split Buttons</legend>

        <fieldset id="splitbuttonsfrommarkup">
            <legend>From Markup</legend>

            <!-- Menu1 -->
            <input type="submit" id="splitbutton1" name="splitbutton1_button" value="Split Button 1">
            <select id="splitbutton1select" name="splitbutton1select" multiple>
                <option value="0">One</option>
                <option value="1">Two</option>
                <option value="2">Three</option>                
            </select>

            <!-- Menu2 -->
            <input type="button" id="splitbutton2" name="splitbutton2_button" value="Split Button 2">
            <select id="splitbutton2select" name="splitbutton2select">
                <option value="0">One</option>
                <option value="1">Two</option>
                <option value="2">Three</option>                
            </select>

            <!-- Menu3 -->
            <input type="button" id="splitbutton3" name="splitbutton3_button" value="Split Button 3">
            <div id="splitbutton3menu" class="yui-overlay">
                <div class="bd">Split Button 3 Menu</div>
            </div>
        </fieldset>

        <fieldset id="splitbuttonsfromjavascript">
            <legend>From JavaScript</legend>
        </fieldset>

    </fieldset> 
</form>
</div>
</BODY>		
</HTML>