悬停后关闭vbox的menupopup(Firefox扩展)

时间:2014-06-29 08:26:12

标签: javascript firefox firefox-addon xul

            <menu id="list-menu" class="icon-list menu-iconic" label="Menu list">
                <menupopup>
                    <vbox flex="1" class="help">
                        <html:div class="help-text">
                            <label>Here is help text</label>
                        </html:div> 
                    </vbox>
                    <vbox flex="1" class="list" id="list-box">
                        Here is box with default height 300px;
                    </vbox>
                    <vbox flex="1">
                        <button class="button" value="Here is button" />
                        <button class="button" value="Here is button 2" />                          
                    </vbox>
                </menupopup>
            </menu> 

如果我将鼠标光标快速移动到menupopup中的元素,它就会关闭。如何解决?

提前致谢。

1 个答案:

答案 0 :(得分:1)

哦,我现在看到了,在视频中没有看到,但这是一个子菜单,当你的鼠标在菜单项上时会打开。

LINK TO IMAGE

因此,当您将鼠标悬停在“代理列表&gt;”上时menuitem,打开子menuitem,现在想要将鼠标从此menuitem移到打开的子菜单上,你必须小心移动鼠标,让它鼠标悬停在“代理”上列表&gt;“ menuitem。如果你的鼠标离开了这个“代理列表&gt;”在menuitem到达子menuitem之前,menuitem会使你的子menuitem消失,即使你的鼠标现在超过了menuitem。要解决此问题,您必须防止弹出窗口隐藏,如果鼠标位于您的子stopPropogation上方。我会在这里给你写一些东西,我会继续努力。如果用户鼠标位于此面板上,我的解决方案将在popuphiding上执行overlay.xul但是在这里张贴这个@nmaier可以看出你的问题是什么,也许他在我工作的时候有更好的想法。


好的,这是解决方案: 在onmousenter添加了onmouseleave onmousedown<menupopup onmouseenter="Components.utils.reportError('entered');this.addEventListener('popuphiding', ProxyAddonBar.preventHide, false)" onmousedown="Components.utils.reportError('downed');this.removeEventListener('popuphiding', ProxyAddonBar.preventHide, false)" onmouseleave="Components.utils.reportError('left');this.removeEventListener('popuphiding', ProxyAddonBar.preventHide, false)"> 这样的属性:

overlay.js

然后在preventHide: function(e) { e.preventDefault(); Components.utils.reportError('PREVENTED HIDE'); //you can remove this, this is just a debug message to tell you when it hides } 和此函数中:

stopPropogation

所以现在这可以做你想要的,你可以尝试从我的分叉安装插件:https://github.com/Noitidart/firex/

编辑: 好吧,即使我们实施了上述问题,我也想出了它隐藏的第二个问题。现在发生的事情恰恰相反。如果您小心地从“代理列表&gt;”移动到子菜单,现在从这里你迅速从子菜单移动到“代理列表&gt;”但是在你迷失“禁用代理”的方式上,它会隐藏它,这是正常的预期行为,但如果你想要阻止它,我明白了。忘记<menu>我将编辑上面的代码。因此,解决方法是在onmouseenter="this.childNodes[0].addEventListener('popuphiding', ProxyAddonBar.preventHide, false)" onmouseleave="this.childNodes[0].removeEventListener('popuphiding', ProxyAddonBar.preventHide, false)"标记中添加以下属性:event.relatedTarget

在子菜单项中移动鼠标时,它还触发了错误的进入和离开事件。所以我通过检查 <menu id="proxy-list-menu" class="icon-list menu-iconic" label="&proxy-list;" onmouseenter="this.childNodes[0].addEventListener('popuphiding', ProxyAddonBar.preventHide, false)" onmouseleave="this.childNodes[0].removeEventListener('popuphiding', ProxyAddonBar.preventHide, false)"> <menupopup onmouseenter="if (!event.relatedTarget) { Components.utils.reportError('entered');this.addEventListener('popuphiding', ProxyAddonBar.preventHide, false) }" onmousedown="Components.utils.reportError('downed');this.removeEventListener('popuphiding', ProxyAddonBar.preventHide, false)" onmouseleave="if (!event.relatedTarget) { Components.utils.reportError('left');this.removeEventListener('popuphiding', ProxyAddonBar.preventHide, false) }"> 来解决这个问题。

所以结合上面的两个解决方案,在overlay.xul中我们现在有了这个:

menuitem

@nmaier的问题。进行更改后,如果您从“代理列表&gt;”中移动鼠标子菜单项并意外地悬停,但最后将光标放在子{ - 1}}上,它会阻止隐藏。如果您将鼠标移开并转到“Disalbe Proxy”menuitem或“检查连接速度”,即使我已经删除了preventHide功能,它也不会隐藏子菜单项。只有将鼠标悬停在“代理列表&gt;”上时它才会关闭试。

如果您通过将鼠标悬停在“代理列表&gt;”上打开子菜单并小心地将鼠标移到打开的子菜单,而不会意外地离开“代理列表&gt;”项目,然后一旦你到达子菜单然后通过鼠标悬停到“禁用代理”或“检查连接速度”,它会在一秒钟之后关闭。所以这是正常的隐藏行为,为什么当我阻止隐藏时,一旦我将鼠标悬停在其他标签上,它就不会像平常一样隐藏?