Jquery 使用Ajax/JSON不调用URL的jsTree搜索

Jquery 使用Ajax/JSON不调用URL的jsTree搜索,jquery,ajax,json,jstree,Jquery,Ajax,Json,Jstree,我非常感谢您在以下方面给予我帮助: 我有一个通过URL加载JSON数据的jsTree。所有数据都已预加载 我需要做的是更改搜索功能,根据用户输入通过AJAX使用新的JSON数据重新加载整个树(因为我需要在后端执行更复杂的节点搜索) 首先,我要做的就是让jsTree代码调用我的URL。我从最初加载树时使用的URL开始 然而——这是我找不到解决方案的问题——虽然成功调用URL以首先加载树,但当我键入一些搜索文本并单击“搜索”时,jsTree使用其正常的内部搜索来突出显示节点,但我提供的URL再也不会

我非常感谢您在以下方面给予我帮助:

我有一个通过URL加载JSON数据的jsTree。所有数据都已预加载

我需要做的是更改搜索功能,根据用户输入通过AJAX使用新的JSON数据重新加载整个树(因为我需要在后端执行更复杂的节点搜索)

首先,我要做的就是让jsTree代码调用我的URL。我从最初加载树时使用的URL开始

然而——这是我找不到解决方案的问题——虽然成功调用URL以首先加载树,但当我键入一些搜索文本并单击“搜索”时,jsTree使用其正常的内部搜索来突出显示节点,但我提供的URL再也不会被调用

HTML是

<div>
    <form>
        <div>
             <input id="treeSearchText" type="text" />
             <button id="searchTree" class="btn">Search</button>
             <button id="clearSearch" class="btn">Clear</button>
        </div>
    </form>
</div>

<div id="myJsTree" style="height: 100%;"></div>
我真的很感激任何帮助


谢谢。

你最终得到解决方案了吗

我现在也在做同样的事情,
search
插件选项的
ajax
部分的行为就像jqueryajax选项一样,我指定了
type:“POST”
,一个
success
函数和
数据类型:“JSON”
,而我的success函数则在控制台中记录结果

(不是世界上最好的手册),对于每个匹配的搜索结果,您需要指定指向它的路径,而不包括匹配的节点ID。然后jsTree将加载您提供的路径,并且内置的高亮显示将匹配文本。例如,如果搜索匹配的条目位于
#secondchild
节点(向下3级),则您需要将其传递给jsTree,以便它在搜索中加载该结果:

Array[ '#rootnode', '#firstchild', '#secondchild' ]
这将使用您已经指定的标准数据检索方法加载这三个节点,如果它们在DOM中还不存在的话。通过硬编码您要查找的路径,对JSON结果进行一些测试,看看它是如何工作的

注意:如果在Ajax请求中定义了
success
方法,则需要返回方法中获得的数据对象,这将允许jsTree解析它并执行它的操作。在我的例子中,我有
console.log(data)
,但它什么也没做,因为我事后没有返回数据

编辑

我解决了我的问题,不再返回包含每个匹配元素路径的多个数组,而是需要返回一个包含唯一的节点ID的单级数组,搜索插件按预期对其进行解析,并在执行客户端搜索之前加载新的数组


请参见此处了解我的解释:

您最终得到解决方案了吗?我现在也在做同样的事情,
search
插件选项的
ajax
部分的行为就像jqueryajax选项一样,我指定了
type:“POST”
,一个
success
函数和
数据类型:“JSON”
,我的success函数成功地将结果记录在我的控制台中。下一步,如何刷新树以包含原始结果中不存在的返回节点…我从未找到解决此特定问题的方法。最后我不得不解决这个问题。我所做的是:更改搜索框的功能,使其接受搜索条件并用它重新初始化整个树。然后,我向每个匹配的结果(在服务器端)添加了一个虚拟不可见标志,然后,在重新显示树之后,我重写了jsTree搜索功能,以始终使用该虚拟标志高亮显示节点。不是最优雅的,但它工作得非常好。请参阅上面关于我实现了什么解决方案来解决此错误的评论。很好,我将把此解决方案留给将来有相同问题的其他人。
$("#searchTree").click(function() {
    $("#myJsTree").jstree("search", $("#treeSearchText").val());
    return false;
});
Array[ '#rootnode', '#firstchild', '#secondchild' ]