代码之家  ›  专栏  ›  技术社区  ›  Doug Neiner

如何触发元素上的浏览器上下文菜单。(就像用户右键单击一样)

  •  9
  • Doug Neiner  · 技术社区  · 15 年前

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

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

    感谢您的帮助!

    3 回复  |  直到 14 年前
        1
  •  14
  •   Josh Stodola    15 年前

    很抱歉,作为不幸消息的传达者,这是不可能的。

        2
  •  2
  •   user250343    15 年前

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

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

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

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

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

    或者,为什么不使文本字段透明,并将覆盖图完全置于文本字段下方?

    如果这在技术上不可行,那么至少在针对目标浏览器归档bug或增强方面有一点意义。

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

        3
  •  1
  •   user270918    14 年前

    我有一个可能的解决方案可以满足你的需要。它还不完美,我只在一些浏览器(Fox 3.6、IE7、IE8、Chrome 4、Safari 3 on XP)中做了一些快速测试,需要进行调整和改进,但这只是一个开始。基本上,这个想法是删除鼠标右键单击鼠标左键的标签,这样所需的字段就会被鼠标右键事件击中,从而在相关字段上启动上下文菜单。

    // 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浏览器遇到了一个奇怪的问题,在标签再次显示之前需要点击两次进出(我认为这与事件时间有关)。通过查看代码,您可以很容易地了解发生这种情况的原因。还注意到狐狸在粘贴到田间后有时会出现轻微的故障,在模糊的标签上出现一瞬间,而不应该出现。如果您决定将此方法合并到您的代码中,那么这应该是一个非常简单的纠正方法。