我正在使用jstree插件,带有ajax调用。在某些时候,我打电话给
$("#tree").jstree("refresh");
以检索通过ajax调用创建的新节点。这很有效,只有select_node.jstree在刷新时被触发。有没有办法阻止在树刷新时触发select_node? p>
答案 0 :(得分:6)
我最终在刷新之前使用设置标志为true,并且在select_node事件触发器中,仅在标志设置为false时执行逻辑,否则将其设置为false并且不执行任何其他操作:
refresh = true;
$("#tree").jstree("refresh");
[...]
$("#tree").jstree({...}).bind("select_node.jstree", function (e, data) {
if (refresh) {
refresh = false;
} else {
// do my thing
}
});
答案 1 :(得分:2)
或者您可以在刷新后取消选择所有节点
refresh=true;
$("#tree").jstree("refresh");
$("#tree").jstree("deselect_all");
这应该有效!
答案 2 :(得分:2)
bool的问题是如果当前选择的节点有子节点,将为每个子节点触发select_node.jstree。
相反,刷新函数中有two parameters。第二个可以是bool或函数,它接收具有core.selected数组的状态对象,该数组包含所有可见节点。如果清空数组并返回状态,则根本不会触发select_node.jstree。
var tree = $('#mytree').jstree(true);
tree.refresh(false, function (state) {
//console.dir(state);
state.core.selected = [];
return state;
});
答案 3 :(得分:1)
如果您正在使用UI插件,则刷新()函数"允许在刷新之前保存选择状态并在之后恢复它#34;。因此,如果当前所选节点(刷新之前)是要刷新的节点的子节点,则在刷新之后将通过触发reselect()函数来恢复其状态。刷新功能锁定如下:
refresh : function (obj) {
var _this = this;
this.save_opened();
if(!obj) { obj = -1; }
obj = this._get_node(obj);
if(!obj) { obj = -1; }
if(obj !== -1) { obj.children("UL").remove(); }
else { this.get_container_ul().empty(); }
this.load_node(obj, function () {
_this.__callback({ "obj" : obj});
_this.reload_nodes(); //this will trigger the reselect() function
});
我有同样的问题,我评论了那一行(_this.reload_nodes())。不要认为这是一个最佳解决方案,但解决了我的问题。
答案 4 :(得分:1)
在刷新树之前取消选择节点会起作用。