スポンサードリンク

jQuery
jQuery

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(){
	//子があるリストをクリックした場合
	$(&quot;#tree_list p&quot;).click(function(){
		$(this).next(&quot;ul&quot;).slideToggle();
		$(this).parent(&quot;li&quot;).siblings().children(&quot;ul&quot;).slideUp();
		$(this).children(&quot;span&quot;).toggleClass(&quot;open&quot;);
		$(this).parent(&quot;li&quot;).siblings().find(&quot;span&quot;).removeClass(&quot;open&quot;);
		$(this).parent(&quot;li&quot;).siblings().find(&quot;span&quot;).removeClass(&quot;red&quot;);

		//親を閉じたら子孫も閉じる
		if (!$(this).children(&quot;span&quot;).hasClass(&quot;open&quot;)) {
			$(this).next(&quot;ul&quot;).find(&quot;ul&quot;).slideUp();
			$(this).next(&quot;ul&quot;).find(&quot;span&quot;).removeClass(&quot;open&quot;);
		}

		var text1 = &quot;&quot;;
		$('.open').each(function(i){
			if (i == 0){
				text1 = $(this).text();
			}else{
				text1 = text1 + ' &amp;gt; ' + $(this).text();
			}
			$('#note').val(text1);
		})

	});

	//子がないリストをクリックした場合
	$('.click').click(function(){
		$(this).toggleClass(&quot;red&quot;);
		$(this).parent(&quot;li&quot;).siblings().children(&quot;ul&quot;).slideUp();
		$(this).children(&quot;span&quot;).toggleClass(&quot;open&quot;);
		$(this).parent(&quot;li&quot;).siblings().find(&quot;span&quot;).removeClass(&quot;open&quot;);
		$(this).parent(&quot;li&quot;).siblings().find(&quot;span&quot;).removeClass(&quot;red&quot;);

		var text2 = &quot;&quot;;
		$('.open').each(function(j){
			if (j == 0){
				text2 = $(this).text();
			}else{
				text2 = text2 + ' &amp;gt; ' + $(this).text();
			}
		})
		//押されていいたかを判断
		if ($(this).hasClass('red')){
			$('#note').val(text2 + ' &amp;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 &gt; 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

(使い方)
ナビゲーションメニューに便利な「Treeview」の使い方

こちらは使いやすかったのですが、

テキストフォームへ入力するというカスタマイズでうまくいかなかったので

今回は使いませんでした。

スポンサードリンク