删除 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 对象实际上被删除了,它们带上所有事件侦听器。

我不知道你想要完成什么,但是如果你需要使用销毁,你将不得不在重新创建树后重新添加所有的监听器。

否则你应该尝试找到一种非破坏性的方式来做你的事情,通常有一个,除了极少数情况外,核弹选项从来都不是一个真正的好主意。