删除 jstree 中的根节点会分离事件侦听器
Deleting root nodes in jstree detaches event listeners
我想通过删除所有根节点并使用 ajax 回读结构来重新创建 jstree。如果我使用:
$("#tree").jstree("destroy");
然后重新创建 jstree 实例:
$("#tree").jstree({ "core": {"check_callback" : true} });
它绘制了一个新的jstree。我添加了来自 ajax 的 json 信息,但是当我单击根节点时事件侦听器不再工作。
这是有效的解决方法:
var ref = $("#tree").jstree(true); // get an existing instance
var nodes = ref.get_node("#").children; // -1 didn't work, so I used "#"
while (nodes.length > 0){
ref.delete_node(nodes[0]);
}
"destroy" 方法是否缺少任何允许事件侦听器与新的 jstree 实例连接回来的参数?
不,那是不可能的,因为 destroy
函数 "remove all traces of jstree from the DOM and destroy all instances" (jstree documentation): 这意味着构成 jstree 的 jquery 对象实际上被删除了,它们带上所有事件侦听器。
我不知道你想要完成什么,但是如果你需要使用销毁,你将不得不在重新创建树后重新添加所有的监听器。
否则你应该尝试找到一种非破坏性的方式来做你的事情,通常有一个,除了极少数情况外,核弹选项从来都不是一个真正的好主意。
我想通过删除所有根节点并使用 ajax 回读结构来重新创建 jstree。如果我使用:
$("#tree").jstree("destroy");
然后重新创建 jstree 实例:
$("#tree").jstree({ "core": {"check_callback" : true} });
它绘制了一个新的jstree。我添加了来自 ajax 的 json 信息,但是当我单击根节点时事件侦听器不再工作。
这是有效的解决方法:
var ref = $("#tree").jstree(true); // get an existing instance
var nodes = ref.get_node("#").children; // -1 didn't work, so I used "#"
while (nodes.length > 0){
ref.delete_node(nodes[0]);
}
"destroy" 方法是否缺少任何允许事件侦听器与新的 jstree 实例连接回来的参数?
不,那是不可能的,因为 destroy
函数 "remove all traces of jstree from the DOM and destroy all instances" (jstree documentation): 这意味着构成 jstree 的 jquery 对象实际上被删除了,它们带上所有事件侦听器。
我不知道你想要完成什么,但是如果你需要使用销毁,你将不得不在重新创建树后重新添加所有的监听器。
否则你应该尝试找到一种非破坏性的方式来做你的事情,通常有一个,除了极少数情况外,核弹选项从来都不是一个真正的好主意。