Javascript 在Extjs中递归创建菜单和子菜单

Javascript 在Extjs中递归创建菜单和子菜单,javascript,extjs,menu,extjs3,Javascript,Extjs,Menu,Extjs3,有没有办法像Treepanel Extjs中的树节点创建一样递归地创建菜单和子菜单 假设我有空的菜单项 我阅读xml输入来构建菜单和子菜单 我的xml看起来像 <r> <sub> <sub1> <sub 1.1/> <sub 1.1.1/> </sub1> <sub2/> <sub3> <sub 3.1> <sub 3.1.1> </sub3> </

有没有办法像Treepanel Extjs中的树节点创建一样递归地创建菜单和子菜单

假设我有空的菜单项

我阅读xml输入来构建菜单和子菜单

我的xml看起来像

<r>
<sub>
 <sub1>
  <sub 1.1/>
  <sub 1.1.1/>
</sub1>
<sub2/>
<sub3>
<sub 3.1>
<sub 3.1.1>
</sub3>
</r>

xml可能有任何深度,请提供建议

buildHelpMenuItems:function(){
buildHelpMenuItems: function () {

                var menuItemNodes = Ext.DomQuery.jsSelect('SUB', me.responseXML),
                mb = (toolbarHlpMenu) ? toolbarHlpMenu.menu : '',
                menu,
                menuArray = [];
                newMenuArray = [];
                if(menuItemNodes.length ==0 || !mb)
                    return;
                function buildMenuItem(node, scope) {
                    var menuitem = {};
                    menuitem.text = (node.attributes.getNamedItem('LABEL')) ? node.attributes.getNamedItem('LABEL').nodeValue : '';
                    menuitem.iconCls = (node.attributes.getNamedItem('clsName')) ? node.attributes.getNamedItem('clsName').nodeValue : '';
                    menuitem.url = (node.attributes.getNamedItem('URL')) ? node.attributes.getNamedItem('URL').nodeValue : '';
                    menuitem.handler = scope.helpMenuHandler;
                    menuitem.hidden = (node.attributes.getNamedItem('HIDDEN')) ? eval(node.attributes.getNamedItem('HIDDEN').nodeValue) : false;
                    menuitem.type = (node.attributes.getNamedItem('TYPE')) ? node.attributes.getNamedItem('TYPE').nodeValue : '';
                    return menuitem;
                }
                for (var i = 0; i < menuItemNodes.length; i++) {
                    var node = menuItemNodes[i];
                    menuItem = buildMenuItem(node,me);
                    if (!Ext.isEmpty(node.parentNode.getAttribute('LABEL'))) {
                        menuItem.parentEl = node.parentNode.getAttribute('LABEL');
                    } else {
                        menuItem.parentEl = "";
                    }
                    menuArray.push(menuItem);
                }
                for (var i = 0; i < menuArray.length; i++) {
                    var menuItem = menuArray[i];
                    if (menuItem.parentEl == "") {
                        newMenuArray.push(menuItem);
                    } else {
                        var parentEl = Ext.Array.findBy(menuArray, function (item) {
                                return (item.text == menuItem.parentEl);
                            });
                        if (Ext.isEmpty(parentEl.menu)) {
                            parentEl.menu = [];
                            parentEl.menu.push(menuItem);
                        } else {
                            parentEl.menu.push(menuItem);
                        }
                    }
                }
                mb.add(newMenuArray);

        },
var menuItemNodes=Ext.DomQuery.jsSelect('SUB',me.responseXML), mb=(toolbarHlpMenu)?toolbarHlpMenu.menu:“”, 菜单, menuArray=[]; newMenuArray=[]; if(menuItemNodes.length==0 | |!mb) 返回; 功能构建菜单项(节点、范围){ var menuitem={}; menuitem.text=(node.attributes.getNamedItem('LABEL'))?node.attributes.getNamedItem('LABEL')。nodeValue:“”; menuitem.iconCls=(node.attributes.getNamedItem('clsName'))?node.attributes.getNamedItem('clsName')。nodeValue:“”; menuitem.url=(node.attributes.getNamedItem('url'))?node.attributes.getNamedItem('url')。nodeValue:“”; menuitem.handler=scope.helpMenuHandler; menuitem.hidden=(node.attributes.getNamedItem('hidden'))?eval(node.attributes.getNamedItem('hidden').nodeValue):false; menuitem.type=(node.attributes.getNamedItem('type'))?node.attributes.getNamedItem('type')。nodeValue:“”; 返回菜单项; } 对于(变量i=0;i
这段代码在ExtJS4.2中进行了测试