clutchSelectBox(複数のセレクトボックスで値の絞込みを行うjs) for MovableType

複数のセレクトボックスを並べて、左から順に選んでいくと内容が絞り込まれる jsを書いてみました。今回はそれをMTで実装しました。

トップカテゴリ→サブカテゴリ→サブサブカテゴリという感じで絞り込まれる。

HTML

<div id="exhi_cat">
<ul>
<li>
<select name="" id="label1" size="16">
<MTTopLevelCategories>
<MTSubCategories>
<option value="<mt:categorylabel>"><mt:categorylabel></option>

<MTSetvarBlock name="label2" append="1">
<optgroup label="<mt:categorylabel>">
<MTSubCategories>
<option value="<mt:categorylabel>"><mt:categorylabel></option>

<MTSetvarBlock name="label3" append="1">
<optgroup label="<mt:categorylabel>">
<MTSubCategories>
<option value="<mt:categorylabel>"><mt:categorylabel></option>
</MTSubCategories>
</optgroup>
</MTSetvarBlock>

</MTSubCategories>
</optgroup>
</MTSetvarBlock>

</MTSubCategories>
</MTTopLevelCategories>
</select>
</li>
<li>
<select name="" id="label2" size="16">
<mt:var name="label2">
</select>
</li>
<li>
<select name="" id="label3" size="16">
<mt:var name="label3">
</select>
</li>
</ul>
</div>

Javascript

if($("#exhi_cat").length > 0){
	//$.clutchSelectBox()
	//複数のセレクトボックスで値の絞込みを行うjs(select>optgroup>optionなHTMLが必要)

	//対象要素
	var el = $("#exhi_cat");
	
	//対象要素を複製する
	var cl = el.clone();
	
	$("select",el).attr("height","280px")
	//1個目のセレクト以外を空にする
	$("select",el).not(":first").empty().hide();
	
	var len = $("select",el).length
	
	//セレクトにイベントをセット
	$("select",el).change(function(){
		var index = $("select",el).index(this);
		var val = $(this).val();
		
		//この処理ではselect要素を破壊してしまうため、処理開始前に復元する
		for(i=index + 1;i<len;i++){
			var th = $("select",el).eq(i);
			if(i == index + 1){
			
			var tid = "#" + th.attr("id");
			th.html(cl.find(tid).html());
			th.show();
			}
			else{
				th.empty();
				th.hide();
			}
		}
		
		var target = $("select",el).eq(index + 1);
		
		//最後のセレクト要素で無ければ実行
		if(target.length > 0){
			$("optgroup",target).each(function(){
				if($(this).attr("label") == val){
					//IE7 fix
					// http://www.kinopyo.com/blog/issue-when-using-jquery-to-manipulate-option-to-selectbox-in-ie
					$(this).parent().width();
					
					$("option",this).appendTo($(this).parent());
					$(this).remove();
				}
				else{
					$(this).remove();
					//target.hide();
				}
			 });
		}
		
		//optionが一つもないselectは隠す
		if($("option", target).length == 0){
			target.hide();
		}
		
		var nmArray = [];
		var noArray = [];
		$("select",el).each(function(){
			if($(this).val()){
				nmArray.push($("option:selected",this).text());
				noArray.push($("option:selected",this).val());
				//次のページに送るための準備
				$("#categoryId").val($("option:selected",this).val());
				$("#categoryIdList").val(noArray.join(","))
				$("#categoryNameList").val(nmArray.join(" > "));
			}
		});
		
		$("#current_cat dd").text(nmArray.join(" > "));
	});
}