javascript - 为什么随后单击 jstree 的子级不起作用
问题描述
我遇到了问题jstree
,一旦数据更改click
后将无法正常工作click
,我需要刷新页面以使其正常工作
这是jsfiddle:http: //jsfiddle.net/2Jg3B/2121/
我正在用jstree
新数据替换设置数据,如下所示
"data" :jsondata[index]
注意:请点击渲染的子节点
下面的演示:(请使用 jsfiddle 查看完整视图http://jsfiddle.net/2Jg3B/2121/)
var jsondata = [
[{
"data" : "A node 1",
"metadata" : { id : 123 },
"children" : [ "Child 11", "A Child 12" ]
}],
[{
"data" : "A node 2",
"metadata" : { id : 223 },
"children" : [ "Child 21", "A Child 22" ]
}],
[{
"data" : "A node 3",
"metadata" : { id : 3223 },
"children" : [ "Child 31", "A Child 32" ]
}]
]
function populateWithNewJsonData(index){
$('#jstree').jstree({
"json_data" : {
"data" :jsondata[index]
},
"plugins" : [ "themes", "json_data", "ui" ]
});
}
var i = 0;
var intid = setInterval(function(){
i++;
if(i >= 3) i = 0;
console.log('tree data changed',jsondata[i]);
populateWithNewJsonData(i);
$('p span#spannnnnnn').text(i);
},9000);
$("#jstree").bind(
"select_node.jstree",
function(evt, data) {
if (data.inst._get_parent().length <= 0 || data.inst._get_parent() === -1) {
console.log('clicked data', data.inst.get_json());
} else {
console.log('clicked data',data.inst.get_json());
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://old.static.jstree.com/v.1.0pre/jquery.jstree.js"></script>
<p>
tree data changed with index : <span id="spannnnnnn"></span> data
</p>
<div id="jstree">
</div>
解决方案
因为每次调用jstree
方法时 DOM 都会被销毁并再次创建。所以你必须在创建新的 jstree 后再次分配监听器。旧的只是监听不再存在的节点上的点击事件。
将绑定select_node.tree
事件监听器的代码放入addListener
函数中:
function addListener(){
$("#jstree").bind("select_node.jstree", function(evt, data) {
if (data.inst._get_parent().length <= 0 || data.inst._get_parent() === -1){
console.log('clicked data', data.inst.get_json());
} else {
console.log('clicked data',data.inst.get_json());
}
});
}
在销毁 jstree 之前创建函数以删除侦听器:
function removeListeners(){
$("#jstree").unbind("select_node.jstree");
}
使用它们:
function populateWithNewJsonData(index){
removeListeners();
$('#jstree').jstree({
"json_data" : {
"data" :jsondata[index]
},
"plugins" : [ "themes", "json_data", "ui" ]
});
addListeners();
}
你可以在这个小提琴中看到这些变化
推荐阅读
- javascript - Android上Javascript中的指纹?
- javascript - 如何在threejs中移动形状并编辑顶点
- ruby - Ruby、Webrick 认为每个本地端口都已在使用中
- css - 平板设备媒体查询的最低分辨率?
- reactjs - React - 点击时进行常见问题解答类切换
- android - 如何使演员可触摸 LibGdx
- haskell - 使用 map 函数将返回 Monad 类型的函数应用于列表
- api - 将物联网设备与亚马逊 Alexa 集成
- gradle - gradle/JavaFX 项目中模块 javafx.base 的两个版本
- javascript - 基于动态布尔角度显示 div