Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JsTree-在上下文菜单中排序项目_Javascript_Jstree - Fatal编程技术网

Javascript JsTree-在上下文菜单中排序项目

Javascript JsTree-在上下文菜单中排序项目,javascript,jstree,Javascript,Jstree,有没有办法在上下文菜单(context.menu.items)中对项目进行排序?(还包括子菜单项(contextmenu.items.submenu)-如果与上下文菜单不同,则为该子菜单项) 菜单项不会按照代码中的顺序呈现 我在文件中找不到任何关于这方面的信息: $.jstree.defaults.contextmenu.items我发现这在jstree中被忽略了。简而言之,似乎没有一个好的、可靠的方法来实现这一点。 你的选择是: 控制您声明上下文菜单项的顺序,并希望您的目标浏览器与您一致。

有没有办法在上下文菜单(context.menu.items)中对项目进行排序?(还包括子菜单项(contextmenu.items.submenu)-如果与上下文菜单不同,则为该子菜单项)

菜单项不会按照代码中的顺序呈现

我在文件中找不到任何关于这方面的信息:
$.jstree.defaults.contextmenu.items

我发现这在jstree中被忽略了。简而言之,似乎没有一个好的、可靠的方法来实现这一点。 你的选择是:

  • 控制您声明上下文菜单项的顺序,并希望您的目标浏览器与您一致。
    是的,我已经读到您尝试过这个,但是请再次精确地检查您在控制台中看到的内容,而不是在Chrome开发工具上下文菜单中看到的内容。我发现我们在开发工具中看到的顺序与实际的不同。如果有疑问,请调试并暂停上下文菜单“对象最终状态”,然后尝试使用
    for…in
    循环对其属性进行迭代。这也是jstree中幕后发生的事情(见下文)。
    如果您的配置从一个全新的对象开始,或者您重用并覆盖从
    $.jstree.defaults.contextmenu.items()
    获得的内容,那么这也非常重要。要完全控制属性定义顺序,请确保从纯对象文字开始,并按照希望的顺序从
    $.jstree.defaults.contextmenu.items()
    中复制所需内容。下面是在顶部显示自定义菜单项“打开”的建议:

    在事件处理程序中,考虑分组和分隔符元素,编写自己的重新排序逻辑
正如我所说,这里没有简单的解决方案,比如简单的排序/权重属性

关于实现的一些细节,解释了我们为什么会在这里,以防您感兴趣

整个上下文菜单生成魔术发生在
$.vakata.context.\u parse
方法中。它将以您构建的上下文菜单对象作为参数,并使用
$对其属性进行迭代。每个属性都是
,这就是jstree当前所依赖的顺序。现在是这个(
$。每个
)。MDN对这个循环的看法是它会的。因此,如果浏览器按照声明的顺序执行此操作,那么这是一个令人高兴的巧合,规范没有强制要求这样做。这就是可靠性。。。但如果你能接受这一点,那么在这里也会更容易实现


这种情况下的一个常见解决方案是添加一些排序/权重属性,并在构建上下文菜单时考虑它,但我不认为这是用3.3.4版本实现的。第三种选择是修补jstree实例,如果这是一个可行的解决方案,请自己包含并维护它。

感谢您提供详细的答案。我们已经做了一个变通办法,这样我们就不需要这个了,但希望其他人会觉得这很有用。 "contextmenu": { "items" : function(node) { var _ctxmenu = $.jstree.defaults.contextmenu.items(); var ctxmenu = { "open": { "label": "Open" "action" function(){....}, "separator_after" : true, }, "rename": _ctxmenu.rename, "remove": _ctxmenu.remove, }; return ctxmenu; } } $(document).on("context_parse.vakata", function(evt, data){ //process the data.element.children('li') array })