スポンサードリンク

ECサイトの商品登録などで、
ツリーリストを使ってフォームに入力できると
簡単に作業ができると思いjQueryで作成してみました。
スポンサードリンク
カテゴリー登録でツリーリストを使用

仕事でGoogle Shoppingのカテゴリーを登録するのに
このGoogle Shoppingのカテゴリーと同じように
クリックしてリストを選べて入力できるものはないかと
プラグインなど探していたのですが
痒いところに手が届くような
ちょうどいいものがなかったので実装してみました。
ツリーリストの実装

ツリーリストの作成はこちらのアコーディオンメニューを参考にさせて頂きました。
jQuery(+CSS3)で作るアコーディオンメニュー(2段アコーディオン対応)
デモ
上記のような感じのものを作ります。
HTMLにツリーリストを作ります。
<input type="text" id="note" name="note" value="" maxlength="200" size="60" /> <ul id="tree_list"> <li> <p><span class="">リスト1</span></p> <ul> <li> <p><span class="">リスト1-1</span></p> <ul> <li> <p><span class="">リスト1-1-1</span></p> <ul> <li><span class="click">リスト1-1-1a</span></li> <li><span class="click">リスト1-1-1b</span></li> <li><span class="click">リスト1-1-1c</span></li> </ul> </li> <li> <p><span class="">リスト1-1-2</span></p> <ul> <li> <p><span class="">リスト1-1-2-1</span></p> <ul> <li><span class="click">リスト1-1-2-1a</span></li> <li><span class="click">リスト1-1-2-1b</span></li> <li><span class="click">リスト1-1-2-1c</span></li> </ul> </li> <li> <p><span class="">リスト1-1-2-2</span></p> <ul> <li><span class="click">リスト1-1-2-2a</span></li> <li><span class="click">リスト1-1-2-2b</span></li> </ul> </li> <li><span class="click">リスト1-1-2-3a</span></li> <li><span class="click">リスト1-1-2-4a</span></li> </ul> </li> <li><span class="click">リスト1-1-1a</span></li> </ul> </li> </ul> </li> <li> <p><span class="">リスト2</span></p> <ul> <li> <p><span class="">リスト2-1</span></p> <ul> <li> <p><span class="">リスト2-1-1</span></p> <ul> <li><span class="click">リスト2-1-1a</span></li> <li><span class="click">リスト2-1-1b</span></li> </ul> </li> </ul> </li> <li> <p><span class="">リスト2-2</span></p> <ul> <li><span class="click">リスト2-2-1a</span></li> <li><span class="click">リスト2-2-1b</span></li> </ul> </li> <li> <p><span class="">リスト2-3</span></p> <ul> <li> <p><span class="">リスト2-3-1</span></p> <ul> <li><span class="click">リスト2-3-1a</span></li> <li><span class="click">リスト2-3-1b</span></li> </ul> </li> </ul> </li> </ul> </li> </ul>
ul要素を入れ子にしてリストを作ります。
pが開閉操作部分なので親カテゴリーをここに入れます。
子孫がない場合はliで囲み、さらにspanを使いclickクラスで囲みます。
spanを使ってclickクラスを指定してるのは
クリックできる範囲を文字だけにしたかったためです。
jQueryを書きます
$(function(){ //子があるリストをクリックした場合 $("#tree_list p").click(function(){ $(this).next("ul").slideToggle(); $(this).parent("li").siblings().children("ul").slideUp(); $(this).children("span").toggleClass("open"); $(this).parent("li").siblings().find("span").removeClass("open"); $(this).parent("li").siblings().find("span").removeClass("red"); //親を閉じたら子孫も閉じる if (!$(this).children("span").hasClass("open")) { $(this).next("ul").find("ul").slideUp(); $(this).next("ul").find("span").removeClass("open"); } var text1 = ""; $('.open').each(function(i){ if (i == 0){ text1 = $(this).text(); }else{ text1 = text1 + ' &gt; ' + $(this).text(); } $('#note').val(text1); }) }); //子がないリストをクリックした場合 $('.click').click(function(){ $(this).toggleClass("red"); $(this).parent("li").siblings().children("ul").slideUp(); $(this).children("span").toggleClass("open"); $(this).parent("li").siblings().find("span").removeClass("open"); $(this).parent("li").siblings().find("span").removeClass("red"); var text2 = ""; $('.open').each(function(j){ if (j == 0){ text2 = $(this).text(); }else{ text2 = text2 + ' &gt; ' + $(this).text(); } }) //押されていいたかを判断 if ($(this).hasClass('red')){ $('#note').val(text2 + ' &gt; ' + $(this).text()); }else{ $('#note').val(text2); } }); });
【pタグ】をクリックした場合と【clickクラス】をクリックした場合の2つを作ります。
・・・1つでまとめたかったんですが、僕の実力では2つでしかできなかったです。
内容としては【pタグ】か【clickクラス】クリックしたら
【openクラス】がついているものを拾っていくというイメージです。
そして、リストの開いているもののテキストをテキストフォームに入力させたいので
他のリストを開いた場合は、開いていたリストと
その子や孫も閉じるようにしています。
また、子や孫がないツリーをクリックした場合は
そのリスト自体が最後に追加するという形です。
CSSはツリー表示部分はこのように記述しました
/*ツリーリストの表示*/ #tree_list p span { padding-left: 15px; background-image: url('../img/plus.gif'); background-repeat: no-repeat; background-position: left center; cursor:pointer; } #tree_list p span.open { color: #F00; background-image: url('../img/minus.gif'); } #tree_list ul { display:none; } #tree_list ul > li { padding-left: 5px; } .click { padding-left: 15px; background-image: url('../img/point.gif'); background-repeat: no-repeat; background-position: left center; cursor:pointer; } .red { color: #F00; }
ツリーリストっぽくするために位置をpaddingで調整して
背景にプラス、マイナスの画像を使ってます。
openクラスが付いたらマイナスの画像に切り替わるようになってます。
子孫がないリストは点の画像を使用しています。
テキストフォームに入力している項目は
赤く表示させるためにredクラスを用意してます。
デザインや画像などは変えても問題ないです。
とりあえずこれで問題なく比較的簡単に入力できそうです。
リスト作ることが面倒くさいかもしれませんが・・・
参考までにツリーメーニューでプラグインもありました。
(使い方)
ナビゲーションメニューに便利な「Treeview」の使い方
こちらは使いやすかったのですが、
テキストフォームへ入力するというカスタマイズでうまくいかなかったので
今回は使いませんでした。
スポンサードリンク