12

我需要通过 javascript 触发打开浏览器(IE、Firefox、Safari 等)上下文菜单。我要解决的问题是,当右键单击覆盖的元素时,它下面的元素会显示其上下文菜单。因此,如果顶部元素是标签,当您右键单击时,我需要显示下面输入元素的上下文菜单。

我知道如何不显示标签的上下文菜单,但我不知道如何任意打开上下文菜单。

任何帮助表示赞赏!

4

3 回答 3

18

很抱歉成为不幸消息的承担者,但这对于 Javascript 是不可能的。

于 2009-08-06T21:23:02.757 回答
3

我不想让你失望,恰恰相反,特别是因为你回答了我自己的问题:)

我不认为可以通过网页上的普通脚本访问浏览器的联系菜单。

如果您所要求的实际上是可行的,那么浏览器制造商可能会认为这是一个错误并删除此行为。跨浏览器,这种行为在今天不太可能出现。

为什么不捕获鼠标事件,并且每当鼠标直接位于要为其显示上下文菜单的下方元素区域时,将覆盖元素推到下方,否则返回顶部?

这是我能想到的一种可能性,基本上根据鼠标位置显示/暴露隐藏的元素。就像在覆盖层上切一个洞一样。

或者为什么不让文本字段透明并将覆盖层完全放在文本字段下方?

如果这在技术上不起作用,那么至少您可以针对目标浏览器提交错误或增强功能。

顺便说一句,如果用户直接右键单击插入符号的位置,看起来上下文菜单实际上可以工作,所以这可能是您需要考虑的另一个漏洞。

于 2010-01-17T03:50:18.337 回答
2

我有一个可能适合您需求的解决方案。它还不完美,我只在几个浏览器(Fox 3.6、IE7、IE8、Chrome 4、Safari 3 on xp)中做了一些快速测试。它需要调整和改进,但它是一个开始。基本上,这个想法是在右键单击 mousedown 时删除标签,以便 mouseup 事件击中所需的字段,从而在相关字段上启动上下文菜单。

// Remove the contextmenu from "In-Field" Labels
base.$label.bind("contextmenu",function(e){
    return false;
}); 

// Detect right click on "In-Field" label:
// hide label on mousedown so mouseup will target the field underneath.
base.$label.mousedown(function(e){          
    if ( e.which == 3 ){
        var elLbl = $(this); 
        elLbl.hide();
        var elFid = $(this).attr("for");
        // bind blur event to replace the label when we are done.
        $("#" + elFid ).bind("blur.infieldlabel",function(){                    
            elLbl.show();
            $("#" + elFid ).unbind("blur.infieldlabel");                    
        });             
        return false;
    }
}); 

IE 和 Safari 浏览器遇到一个奇怪的问题,您需要在标签再次显示之前单击进出两次(我认为这与事件时间有关)。您可以通过查看代码轻松了解为什么会发生这种情况。还注意到有时在粘贴到田间后,狐狸会出现轻微的故障,在模糊时,标签在不应该出现的瞬间出现。如果您决定将此方法合并到您的代码中,这应该是一件相当简单的纠正措施。

于 2010-02-11T08:18:47.410 回答