jQuery:preventDefault()不处理输入/单击事件?

jQuery:preventDefault()不处理输入/单击事件?,jquery,events,right-click,input-field,Jquery,Events,Right Click,Input Field,我想在用户右键单击输入字段时禁用默认上下文菜单,以便显示自定义上下文菜单。一般来说,通过执行以下操作可以很容易地禁用右键单击菜单: $([whatever]).bind("click", function(e) { e.preventDefault(); }); 事实上,除了FF中的输入字段之外,我几乎可以在每一个元素上都这样做——有人知道为什么或者可以告诉我一些文档吗 这是我正在使用的相关代码,谢谢大家 HTML: 编辑: 对不起,在阅读了评论之后,我意识到我应该澄清一些事情 1) 从某种意

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

$([whatever]).bind("click", function(e) { e.preventDefault(); });
事实上,除了FF中的输入字段之外,我几乎可以在每一个元素上都这样做——有人知道为什么或者可以告诉我一些文档吗

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

HTML:

编辑:

对不起,在阅读了评论之后,我意识到我应该澄清一些事情

1) 从某种意义上说,上面的代码确实有效。代码能够对单击的按钮进行排序,它只是不在乎是否显示e.preventDefault(),右键单击菜单仍然会弹出。换句话说,如果你在e.按钮上放一个警报,你会得到左边的1或0,右边的2…但它只是嘲笑我,仍然显示该死的默认菜单


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

我刚刚在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();
  }

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

var _class = "input.hideRightClick";

this.setListeners = function() {
    $(window).click(function(e) {
        if($(e.target).is(_class))
        {
            e.preventDefault(); 
            alert("hide!");
        }
    });
}

用于禁用默认关联菜单的跨浏览器解决方案:

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中对此进行了测试。

如果只是
return false
呢?另外,尝试
e.which
而不是
e.button
。可能与此有关等等,当您单击鼠标右键时它会评估为真?A) 不应该。B) 它在我的机器上(FF 3.5.7)也不起作用,即使我把e.preventDefault()放在if/else if之前/之外(这意味着它无论如何都应该启动),FF似乎也不在乎。为什么
if(event.which==3){//something}
取消上下文菜单禁用?
$('myElement').bind('contextmenu', function(){

    // Handle right-click event.
    return false;
});
   // 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;

    });