我的一个要求是(在ajax on demand上)加载在jstree上选择的节点的所有子节点,并返回其下的叶节点的所有锚元素id。我能够通过将所选节点传递给open_all方法来实现这一点,而在open_all事件中,我将返回引导节点的ID。但是,我的问题是当selected是除root之外的非叶子节点时,open_all事件会触发两次。如果所选节点是root或leaf,则它可以正常工作。非常感谢任何帮助。
$tree
.bind("loaded.jstree", function(event, data) {
//alert("Tree loaded");
})
.bind("select_node.jstree", function(event, data) {
data.inst.open_all(data.rslt.obj, true);
})
.bind("check_node.jstree", function(event, data) {
//checkboxes are enabled on some pages
data.inst.open_all(data.rslt.obj, true);
})
.bind("open_all.jstree", function(event, data) {
//get all ids of leaf nodes under selected node if selected node is
//non-leaf node. If selected node is a leaf node return it's id.
//alert(leaf_ids);
//**Here is my problem:** The alert box pops up twice if
//open_all was passed a non-leaf node other than root.The first time
//ids are empty but the second time I see the ids.
})
.jstree({
"plugins": plugins_include,
"core": core_options,
"html_data": html_data,
"themes": {
"theme": "classic",
"dots": false,
"icons": false
},
"strings": { loading: "Loading..." },
"checkbox": {
"override_ui": true
},
"ui": { "select_multiple_modifier": false }
});
答案 0 :(得分:1)
我不知道你是否有更深层次的理由使用open_all绑定,但open_node也是一个选项。
.bind("open_node.jstree", function (event, data) {
var node = $(data.rslt.obj);
var nodeID = node.attr('id');
var children = $.jstree._reference(node)._get_children(node);
if (children.length==0){
// Dynamically load node since it has nothing loaded yet
}
})
答案 1 :(得分:1)
我不得不修改jstree插件的open_all方法来解决我的问题。
我在open_all函数的最后一行添加了一个条件:this.is_open(original_obj)
//以便在所有节点打开后触发回调 if( this.is_open(original_obj)&& original_obj.find('li.jstree-closed')。length === 0){this .__ callback({“obj”:original_obj} ); }
我做出此更改后,警报框停止弹出两次。