JsTree 选择被逆转
JsTree Selection is getting reversed
所以我的问题是,基本上,我在 JsTree 中设置了一些节点,它在我的页面上已有的一棵树上工作,但那些动态加载的节点只会恢复选择。这意味着它们确实按预期被选中,但之后由于某种原因被取消选择。
选择代码:
selected.forEach(function(element,index,array){
if(element !== null)
$(value).parent().find(".filter-value-tree").jstree("select_node", "#"+element);
});
和jquery-2.1.1.js中的代码行:
return typeof n !== U && n.event.triggered !== b.type ? n.event.dispatch.apply(a, arguments) : void 0
在该特定行之前,节点已按预期选择。
显示我正在尝试做的事情的基础知识的片段(它现在似乎重现了问题):
$("#testBtn").on("click", function() {
loadTree(getValueTree);
$("#filter-value-tree").jstree("select_node", "#2");
});
function loadTree(callback){
//Normally there would be a ajax request here, to be used with differenct callback functions
var response = '<li id="1">Information</li><li id="2">Service</li><li id="3">Claim</li><li id="4">Education</li>';
setTimeout(function(){
callback(response);
}, 1000);
}
function getValueTree(result){
$("#testDiv").append("<div id='filter-value-tree'><ul><li id='1'>Test1</li><li id='2'>Test2</li></ul></div>");
$("#filter-value-tree").find("ul").append(result);
$("#filter-value-tree").jstree({
'core' : {
'check_callback': true,
'multiple': true
},
"plugins" : [ "changed" ]
});
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" />
<button type="button" id="testBtn">Test</button>
<div id="testDiv"></div>
为了结束它,提供更多信息,我正在从我的 mysql 数据库的 php 页面中使用 AJAX 加载 jstree 的内容。 ajax 调用设置为 async: false,就好像有人想知道它是否可能那样。加载按预期工作,我只想说节点正在被选中,但在一段时间后才被取消选中(如果我在 jquery-2.1.1.js 的那一行逐步调试,所以调试器完成之前的最后一件事)。
希望你能帮助我,在此先感谢。
您遇到的问题与synchronous/asynchronous代码有关:
在此代码中:
loadTree(getValueTree);
$("#filter-value-tree").jstree("select_node", "#2");
...最后一条语句被执行 before getValueTree
被调用。这是因为 loadTree
将执行 Ajax 调用,但会立即 return 而不调用回调。仅当响应将通过异步事件传入时才调用回调。在您当前的代码完成 运行(即清空调用堆栈)之前,永远不会处理此事件。只有这样队列中的事件才会被处理。
为了解决这个问题,将该语句移到回调部分,例如,如下所示:
loadTree(function () {
getValueTree();
$("#filter-value-tree").jstree("select_node", "#2");
});
所以我的问题是,基本上,我在 JsTree 中设置了一些节点,它在我的页面上已有的一棵树上工作,但那些动态加载的节点只会恢复选择。这意味着它们确实按预期被选中,但之后由于某种原因被取消选择。
选择代码:
selected.forEach(function(element,index,array){
if(element !== null)
$(value).parent().find(".filter-value-tree").jstree("select_node", "#"+element);
});
和jquery-2.1.1.js中的代码行:
return typeof n !== U && n.event.triggered !== b.type ? n.event.dispatch.apply(a, arguments) : void 0
在该特定行之前,节点已按预期选择。
显示我正在尝试做的事情的基础知识的片段(它现在似乎重现了问题):
$("#testBtn").on("click", function() {
loadTree(getValueTree);
$("#filter-value-tree").jstree("select_node", "#2");
});
function loadTree(callback){
//Normally there would be a ajax request here, to be used with differenct callback functions
var response = '<li id="1">Information</li><li id="2">Service</li><li id="3">Claim</li><li id="4">Education</li>';
setTimeout(function(){
callback(response);
}, 1000);
}
function getValueTree(result){
$("#testDiv").append("<div id='filter-value-tree'><ul><li id='1'>Test1</li><li id='2'>Test2</li></ul></div>");
$("#filter-value-tree").find("ul").append(result);
$("#filter-value-tree").jstree({
'core' : {
'check_callback': true,
'multiple': true
},
"plugins" : [ "changed" ]
});
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" />
<button type="button" id="testBtn">Test</button>
<div id="testDiv"></div>
为了结束它,提供更多信息,我正在从我的 mysql 数据库的 php 页面中使用 AJAX 加载 jstree 的内容。 ajax 调用设置为 async: false,就好像有人想知道它是否可能那样。加载按预期工作,我只想说节点正在被选中,但在一段时间后才被取消选中(如果我在 jquery-2.1.1.js 的那一行逐步调试,所以调试器完成之前的最后一件事)。
希望你能帮助我,在此先感谢。
您遇到的问题与synchronous/asynchronous代码有关:
在此代码中:
loadTree(getValueTree);
$("#filter-value-tree").jstree("select_node", "#2");
...最后一条语句被执行 before getValueTree
被调用。这是因为 loadTree
将执行 Ajax 调用,但会立即 return 而不调用回调。仅当响应将通过异步事件传入时才调用回调。在您当前的代码完成 运行(即清空调用堆栈)之前,永远不会处理此事件。只有这样队列中的事件才会被处理。
为了解决这个问题,将该语句移到回调部分,例如,如下所示:
loadTree(function () {
getValueTree();
$("#filter-value-tree").jstree("select_node", "#2");
});