Javascript JsTree选择正在反转

Javascript JsTree选择正在反转,javascript,jquery,ajax,jstree,Javascript,Jquery,Ajax,Jstree,所以我的问题是,基本上,我在JsTree中设置了一些节点,它在我已经在页面上的一棵树上工作,但是那些动态加载的节点只是恢复选择。这意味着它们确实会按预期被选中,但由于某种原因,之后会被取消选中 选择代码: selected.forEach(function(element,index,array){ if(element !== null) $(value).parent().find(".filter-value-tree").jstree("select_node",

所以我的问题是,基本上,我在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”)。在(“单击”,函数(){
loadTree(getValueTree);
$(“#筛选值树”).jstree(“选择#节点”,“#2”);
});
函数loadTree(回调){
//通常这里会有一个ajax请求,用于不同的回调函数
风险值响应=“
  • 信息
  • 服务
  • 索赔
  • 教育
  • ”; setTimeout(函数(){ 回调(响应); }, 1000); } 函数getValueTree(结果){ $(“#testDiv”)。追加(
    • Test1
    • Test2
      • ); $(“#筛选值树”).find(“ul”).append(结果); $(“#筛选值树”).jstree({ “核心”:{ “检查回调”:true, “多重”:真 }, “插件”:[“已更改”] }); }
    
    试验
    
    您面临的问题与同步/异步代码有关:

    在此代码中:

    loadTree(getValueTree);
    $("#filter-value-tree").jstree("select_node", "#2"); 
    
    。。。最后一条语句在调用
    getValueTree
    之前执行。这是因为
    loadTree
    将执行Ajax调用,但将立即返回而不调用回调。只有当响应通过异步事件传入时,才会调用回调。在当前代码完成运行(即清空调用堆栈)之前,永远不会处理此事件。然后才处理队列中的事件

    要解决此问题,请将该语句移动到回调部分,例如,如下所示:

    loadTree(function () {
        getValueTree();
        $("#filter-value-tree").jstree("select_node", "#2"); 
    });
    

    如果没有重现问题的代码,我想你不会得到多少有用的回答。@trincot是的,我知道。但问题是,我不知道问题出在哪里,复制整个过程太耗时了。更重要的是,如果有人知道问题可能在哪里,而不是问题的完整解决方案。您可以尝试使用
    setTimeout
    在代码段中重现问题,这将模拟Ajax响应。然后在重现问题的代码段中硬编码响应。我不知道您面临的问题是什么,但这一定与您的代码有关。@trincot好主意!更新的代码片段,希望对您有所帮助。好的,这揭示了问题所在。我已经发布了我的答案。非常感谢!我犯了个愚蠢的错误,但看不清。