JqTree のノードに追加で属性を追加する方法
▼Foo ├─ Bar └─ Baz
JavaScript のツリービューなライブラリの JqTree を使って上のようなツリーを描画すると、以下の様な HTML が生成される。
<li class="jqtree_common jqtree-folder"> <div> <a class="jqtree_common jqtree-toggler">▼</a> <span class="jqtree_common jqtree-title ui-draggable">Foo</span> </div> <ul class="jqtree_common "> <li class="jqtree_common"> <div> <span class="jqtree-title jqtree_common ui-draggable">Bar</span> </div> </li> <li class="jqtree_common"> <div> <span class="jqtree-title jqtree_common ui-draggable">Baz</span> </div> </li> </ul> </li>
このノードを JqTree のドラッグ & ドロップ機能を使わず、jQuery UI のドラッグ & ドロップを利用して、ツリー以外の所にドロップした際に何のノードがドロップしたか知りたい。
ドロップした際には タグの情報が取得できるので、そこに id なり data- 属性があれば、そこから Foo の情報を格納している Collection に問い合わせて他の情報を取得とかができる。
Foo という名前がユニークである保証がないので、ユニークな ID を入れたい*1。
# ユニークな ID から Collection 内を get() で逆引きしたい
以下のようにツリーを構築する際にコールバックを定義すればいける。
var nodes = [{ label: 'Foo', children: [ {label: 'Bar', id: 'bar'}, {label: 'Baz', id: 'baz'}, ] }]; var tree = $('#tree'); tree.tree({ data: nodes, autoOpen: true, onCreateLi: function (node, li) { if (typeof(node.id) !== 'undefined') { var targetNode = $(li).children('div').children('span')[0]; targetNode['id'] = 'node-id-' + node.id; $(targetNode).attr('data-node-type', node.type); } } });
onCreateLi でノードを生成した際にコールバックで呼ばれるので、その中で タグの中に埋め込んでやる。
node.id には data: nodes の中で id を定義したものが来るので、それを span タグ内の id に突っ込めば出来た。
*1:簡単に言えば Backbone.js の cid