jsTree 不能 select 叶子
jsTree can't select leafs
所以我这里有一个 jsTree 实例,它工作正常。我在列表项中动态存储数据集(使用 jquery .attr()
和 .data()
),
html 集是预编码的(没有通过 ajax 或其他方式加载)。
结构如下所示:
<ul>
<li>Node1
<ul>
<li>Node2
<ul>
<li data-material-id="bpch1u1">Leaf 1</li>
<li data-material-id="bpch1u2">Leaf 2</li>
</ul>
</li>
</ul>
</li>
然后我有一个按钮:
<button type="button" class="btn btn-primary" onclick="openMaterial($(this))">Open Material now</button>
在侦听外部脚本时,该按钮具有 data-material
属性。属性设置正确,我可以读取它。
我现在想要的是点击按钮 openMaterial()
它应该用 data-material-id= button-material
打开相应的叶子
我的函数如下所示:
function openMaterial(el)
{
//get treenode with material id
var node = $('li[data-material-id="' + el.data('material') + '"]');
}
node 在调用后持有一个 jQuery 对象,但遗憾的是它是空的(持有主体)。我相信这是因为 jsTree
的任何未打开的节点或叶子都不在 DOM 中。意味着即使我打开它们并再次关闭它们,或者加载它们,它们也不会出现在 DOM.
我尝试了 jsTree 函数 open_all
和 load_all
,它们似乎有效,但我仍然无法获取叶子。是否有另一种选择仅使用 data-attribute
?
即可获得相应的叶子
编辑:
再次尝试使用内置的 jsTree 函数 get_node
:
var node = $('#material_list').jstree('get_node','li[data-material-id="' + el.data('material') + '"]');
它根本不起作用。如果我在所有节点都关闭时调用它 returns “false
”,如果节点和叶子被打开(以编程方式或手动方式)它 returns 正确的叶子。
我现在有两个解决方案:
-逐步沿着树向下冒泡(一个接一个打开节点)
-打开所有节点,获取节点,触发事件,再次关闭所有节点
我还没有尝试过冒泡,因为第二个选项对我来说似乎更有效,因为我只需要叶子的 data-material 属性。
所以这可以用一个 jQuery 选择器保持在一行中:
$('#material_list').jstree('open_all')
.jstree('select_node','li[data-material-id="' + el.data('material') + '"]')
.jstree('close_all');
另一种方法是遍历内部 jstree 存储并从那里获取您的项目(以及 select 它们或简单地显示它们):
var instance = $('#material_list').jstree(true),
material = el.data('material'),
i;
for(i in instance._model.data) {
if(i !== '#' && instance._model.data.hasOwnProperty(i)) {
if(instance._model.data[i].li_attr['data-material-id'] === material) {
instance.select_node(i); // use this to reveal the node and select it
instance._open_to(i); // use this to reveal the node
instance.select_node(i, false, true); // use this to select the node without revealing it
}
}
}
所以我这里有一个 jsTree 实例,它工作正常。我在列表项中动态存储数据集(使用 jquery .attr()
和 .data()
),
html 集是预编码的(没有通过 ajax 或其他方式加载)。
结构如下所示:
<ul>
<li>Node1
<ul>
<li>Node2
<ul>
<li data-material-id="bpch1u1">Leaf 1</li>
<li data-material-id="bpch1u2">Leaf 2</li>
</ul>
</li>
</ul>
</li>
然后我有一个按钮:
<button type="button" class="btn btn-primary" onclick="openMaterial($(this))">Open Material now</button>
在侦听外部脚本时,该按钮具有 data-material
属性。属性设置正确,我可以读取它。
我现在想要的是点击按钮 openMaterial()
它应该用 data-material-id= button-material
我的函数如下所示:
function openMaterial(el)
{
//get treenode with material id
var node = $('li[data-material-id="' + el.data('material') + '"]');
}
node 在调用后持有一个 jQuery 对象,但遗憾的是它是空的(持有主体)。我相信这是因为 jsTree
的任何未打开的节点或叶子都不在 DOM 中。意味着即使我打开它们并再次关闭它们,或者加载它们,它们也不会出现在 DOM.
我尝试了 jsTree 函数 open_all
和 load_all
,它们似乎有效,但我仍然无法获取叶子。是否有另一种选择仅使用 data-attribute
?
编辑:
再次尝试使用内置的 jsTree 函数 get_node
:
var node = $('#material_list').jstree('get_node','li[data-material-id="' + el.data('material') + '"]');
它根本不起作用。如果我在所有节点都关闭时调用它 returns “false
”,如果节点和叶子被打开(以编程方式或手动方式)它 returns 正确的叶子。
我现在有两个解决方案:
-逐步沿着树向下冒泡(一个接一个打开节点)
-打开所有节点,获取节点,触发事件,再次关闭所有节点
我还没有尝试过冒泡,因为第二个选项对我来说似乎更有效,因为我只需要叶子的 data-material 属性。
所以这可以用一个 jQuery 选择器保持在一行中:
$('#material_list').jstree('open_all')
.jstree('select_node','li[data-material-id="' + el.data('material') + '"]')
.jstree('close_all');
另一种方法是遍历内部 jstree 存储并从那里获取您的项目(以及 select 它们或简单地显示它们):
var instance = $('#material_list').jstree(true),
material = el.data('material'),
i;
for(i in instance._model.data) {
if(i !== '#' && instance._model.data.hasOwnProperty(i)) {
if(instance._model.data[i].li_attr['data-material-id'] === material) {
instance.select_node(i); // use this to reveal the node and select it
instance._open_to(i); // use this to reveal the node
instance.select_node(i, false, true); // use this to select the node without revealing it
}
}
}