javascript - 如何在 extjs 6 中单击而不是鼠标悬停时显示子菜单?

标签 javascript extjs menu extjs6 extjs6-classic

在 extjs 6 菜单中,如何设置子菜单在单击时显示,而不是在鼠标悬停时显示?我还没有找到任何配置来设置子菜单的显示触发器,并且使用按钮作为菜单项也不起作用。

var myMenu = Ext.create({
        xtype: 'menu',
        items: [{
            text: 'Menu Item 1',
            menu: {
                items: [{
                    text: 'sub-Menu Item 1'
                }, {
                    text: 'sub-Menu Item 2'
                }]
            }
        }, {
            text: 'Menu Item 2',
            menu: {
                items: [{
                    text: 'sub-Menu Item 1'
                }, {
                    text: 'sub-Menu Item 2'
                }]
            }
        }]
    });

最佳答案

您必须重写菜单 onMouseOveronClick 方法以防止菜单展开。还需要将ignoreParentClicks 配置添加到菜单中。

它看起来像:

Ext.define('Ext.o.menu.Menu', {
    override : 'Ext.menu.Menu',
    onClick: function(e) {
        var me = this,
            type = e.type,
            item,
            clickResult,
            iskeyEvent = type === 'keydown';

        if (me.disabled) {
            e.stopEvent();
            return;
        }
        item = me.getItemFromEvent(e);
        if (item && item.isMenuItem) {
            if (!item.menu || !me.ignoreParentClicks) {
                clickResult = item.onClick(e);
            } else {
                e.stopEvent();
            }

            // SPACE and ENTER invokes the menu
            if (item.menu && clickResult !== false) {
                item.expandMenu(e, 0);
            }
        }
        // Click event may be fired without an item, so we need a second check
        if (!item || item.disabled) {
            item = undefined;
        }
        me.fireEvent('click', me, item, e);
    },
    onMouseOver: function(e) {
        var me = this,
            fromEl = e.getRelatedTarget(),
            mouseEnter = !me.el.contains(fromEl),
            item = me.getItemFromEvent(e),
            parentMenu = me.parentMenu,
            ownerCmp = me.ownerCmp;

        if (mouseEnter && parentMenu) {
            parentMenu.setActiveItem(ownerCmp);
            ownerCmp.cancelDeferHide();
            parentMenu.mouseMonitor.mouseenter();
        }

        if (me.disabled) {
            return;
        }

        // Do not activate the item if the mouseover was within the item, and it's already active
        if (item) {
            if (!item.containsFocus) {
                item.focus();
            }
            // This will not be needed here!
            //if (item.expandMenu) {
                //item.expandMenu(e);
            //}
        }
        if (mouseEnter) {
            me.fireEvent('mouseenter', me, e);
        }
        me.fireEvent('mouseover', me, item, e);
    }
});

检查这个 fiddle :https://fiddle.sencha.com/#fiddle/u1m

关于javascript - 如何在 extjs 6 中单击而不是鼠标悬停时显示子菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32625347/

相关文章:

javascript - ExtJs 6 的全局函数

javascript - 是否可以使用 extjs 4 上传没有表单的文件?

javascript - 通过单击切换 div 来关闭我的#overlay 和侧菜单?

java - 在swing中的JMenu中添加图标和文本

javascript - 使用 dojo 修改 div 的文本

javascript - 代码隐藏文件是否与 View 模型相同?

javascript - 数组按两次分组并计算出现次数

javascript - 将脚本/样式从 DOM 传递到子 iFrame

javascript - Sencha 触摸 2 : How to get the values from an HTML input field displayed inside a Panel?

javascript - 跟踪右键单击菜单事件?