Extjs 子菜单在 Chrome 43 上消失

Posted

技术标签:

【中文标题】Extjs 子菜单在 Chrome 43 上消失【英文标题】:Extjs Submenus disappear on Chrome 43 【发布时间】:2015-05-22 14:31:50 【问题描述】:

如何修复 Chrome 43 中子菜单消失的问题?

使用 Extjs 4。

这适用于以前版本的 Chrome。

【问题讨论】:

我今天在 Chrome Canary (45) 中对此进行了测试,它再次运行良好。因此,您可能需要使用未来版本的 Chrome 重新评估您的解决方法。 【参考方案1】:

需要添加此覆盖以解决此问题。

https://www.sencha.com/forum/showthread.php?301116-Submenus-disappear-in-Chrome-43-beta

(感谢 Sencha 论坛上的 festr 用户 - 认为这也需要在 SO 上)

// fix hide submenu (in chrome 43)
Ext.override(Ext.menu.Menu, 
    onMouseLeave: function(e) 
    var me = this;


    // BEGIN FIX
    var visibleSubmenu = false;
    me.items.each(function(item)  
        if(item.menu && item.menu.isVisible())  
            visibleSubmenu = true;
        
    )
    if(visibleSubmenu) 
        //console.log('apply fix hide submenu');
        return;
    
    // END FIX


    me.deactivateActiveItem();


    if (me.disabled) 
        return;
    


    me.fireEvent('mouseleave', me, e);
    
);

【讨论】:

【参考方案2】:

关于同一个链接,https://www.sencha.com/forum/showthread.php?301116-Submenus-disappear-in-Chrome-43-beta,感谢 siq 发布的 #27,这里有一个更通用、非特定的修复:

Ext.apply(Ext.EventManager,
    normalizeEvent: function(eventName, fn) 

        //start fix
        var EventManager = Ext.EventManager,
            supports = Ext.supports;
        if(Ext.chromeVersion >=43 && eventName == 'mouseover')
            var origFn = fn;
            fn = function()
                var me = this,
                    args = arguments;
                setTimeout(
                    function()
                        origFn.apply(me || Ext.global, args);
                    ,
                    0);
            ;
        
        //end fix

        if (EventManager.mouseEnterLeaveRe.test(eventName) && !supports.MouseEnterLeave) 
            if (fn) 
                fn = Ext.Function.createInterceptor(fn, EventManager.contains);
            
            eventName = eventName == 'mouseenter' ? 'mouseover' : 'mouseout';
         else if (eventName == 'mousewheel' && !supports.MouseWheel && !Ext.isOpera) 
            eventName = 'DOMMouseScroll';
        
        return 
            eventName: eventName,
            fn: fn
        ;
    
);

我已经对此进行了测试,我可以验证它是否有效(v. 4.1.2)。

【讨论】:

我很抱歉 - 我应该注意到我将此修复应用于版本 4.1.2。帖子已更新。感谢您指出这一点。

以上是关于Extjs 子菜单在 Chrome 43 上消失的主要内容,如果未能解决你的问题,请参考以下文章

ASP 动态菜单 子菜单 鼠标悬停在子菜单上时消失。

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

带有水平子菜单的纯 html css 菜单。悬停在 IE 中无法正常工作

jQuery 菜单 - 如何在菜单上放置箭头以表示子菜单?

单击后关闭悬停子菜单而不刷新页面

引导子菜单插入符号在 iPad 3 上不可见