9

我想在用户右键单击输入字段时禁用默认 contextMenu,以便我可以显示自定义 contextMenu。一般来说,通过执行以下操作很容易禁用右键菜单:

$([whatever]).bind("click", function(e) { e.preventDefault(); });

事实上,除了 FF 中的输入字段之外,我几乎可以在每个元素上执行此操作 - 任何人都知道为什么或可以将我指向一些文档吗?

这是我正在使用的相关代码,谢谢大家。

HTML:

<script type="text/javascript">
 var r = new RightClickTool();
</script>

<div id="main">
  <input type="text" class="listen rightClick" value="0" />  
</div>

JS:

function RightClickTool(){

var _this = this;
var _items = ".rightClick";

$(document).ready(function() { _this.init(); });

this.init = function() {
 _this.setListeners(); 
}

this.setListeners = function() {
 $(_items).click(function(e) {
  var webKit = !$.browser.msie && e.button == 0;
  var ie = $.browser.msie && e.button == 1;

  if(webKit||ie)
  { 

   // Left mouse...do something()

  } else if(e.button == 2) {
   e.preventDefault(); 

   // Right mouse...do something else();
  }

 });
}

} // Ends Class

编辑:

抱歉,在阅读了评论后,我意识到我应该澄清一些事情。

1)上面的代码确实有效......在某种意义上。代码能够通过单击哪个按钮进行排序,它只是不在乎我说 e.preventDefault() 并且仍然会弹出右键菜单。换句话说,如果您在 e.button 上设置警报,您会得到 1 或 0 表示左侧,2 表示右侧......但它只是在嘲笑我,仍然显示该死的默认菜单!

2) 如果我将 jQuery 选择器放在任何其他元素(输入除外)上,那么一切都会正常工作,FF 将尊重 preventDefault() 调用,并且不会显示默认的右键单击菜单。

4

3 回答 3

12

禁用默认上下文菜单的跨浏览器解决方案:

window.oncontextmenu = function() { return false };

要仅在给定元素内捕获 contextmenu 事件,请使用:

document.getElementById('myElement').oncontextmenu=function(){

    // Code to handle event
    return false;
}

如果您尝试使用除 oncontextmenu 之外的方法来中断右键单击事件,您将获得不同的结果,具体取决于确切的事件场景和浏览器。

在 jQuery 中:

$('myElement').bind('contextmenu', function(){

    // Handle right-click event.
    return false;
});

您还可以使用 jQuery 的 event.which 来确定按下了哪个按钮,但您仍然必须取消默认的 contextmenu 事件:

   // Cancel default oncontextmenu event.
    $(element).bind('contextmenu', function(){ return false });

    $(element).mousedown(function(event){

        switch (event.which)

            case 1:
            // Left mouse
            break;

            case 2:
            // Middle mouse
            break;

            case 3:
            // Right mouse.
            break;

    });

我已经在 IE6(在 Wine 下)、Chrome 11、Firefox 3.6、Opera 11 和 Safari 中对此进行了测试。

于 2011-06-09T01:09:06.363 回答
4

对不起,伙计们,我知道这是一个逃避的“答案”,因为我永远无法弄清楚为什么 webkit 浏览器不喜欢你弄乱输入字段事件,但无论如何,这是可行的。所以解决方案是将监听器应用到整个窗口,然后询问目标是否有你想要应用效果的类......然后从那里开始。老实说,这可能是一个更好的解决方案,因为对于我的特定应用程序,这允许我将此功能应用于我想要的任何元素。

var _class = "input.hideRightClick";

this.setListeners = function() {
    $(window).click(function(e) {
        if($(e.target).is(_class))
        {
            e.preventDefault(); 
            alert("hide!");
        }
    });
}
于 2010-05-13T16:56:26.327 回答
0

我刚刚在 Firefox 3.6 中进行了测试,它正在进入第一个 if 语句,因此永远不会调用 e.preventDefault() 。

  var webKit = !$.browser.msie && e.button == 0; // TRUE IN FIREFOX 3.6

  var ie = $.browser.msie && e.button == 1;

  if(webKit||ie)
  { 

   // Left mouse...do something()

  } else if(e.button == 2) {
   e.preventDefault(); 

   // Right mouse...do something else();
  }
于 2010-04-29T18:41:34.800 回答