5

It seems like a ridiculous easy problem but it appears to be harder...

I want to prevent the default handling of an middle click. I created a JSFiddle and threw in stopPropagation, stopImmediatePropagation, preventDefault and return false - like this:

$(document).on("mousedown", "a", function(e)
{    
    console.log("\nprevent mousedown...");
    e.stopPropagation();
    e.stopImmediatePropagation();
    e.preventDefault();
    console.log("...mousedown prevented");
    return false;
});

But the middle-click is fired. BTW it is fired by the time I release the middle button. Here's the JSFiddle: http://jsfiddle.net/Gq4p9/4/

Tested on Chrome 29, Firefox 23 and IE11.

I hope someone of you can find out, why this script doesn't prevent the default handling.

4

3 回答 3

5

正如您在评论中提到的,如果您将jQuery 对象作为选择器传递,它会起作用

$(document).on ("click", $("a"), function (e) { ...

虽然APIselector应该是字符串类型。

小提琴


此外,您总是可以只使用普通的 javascript click eventListener。

link.addEventListener ("click", function (e) {
  if (e.which === 2) 
      e.preventDefault();
})

这是一个小提琴

于 2013-09-24T08:55:31.047 回答
2

我最近遇到了这个问题(实际上恰恰相反:我只想让中间点击通过)。问题是您要阻止的行为在 上click,并且阻止默认行为mousedown不一定阻止随后事件的默认行为。

虽然当前的解决方案是完全正确的,但它们不适用于 IE8 和更低版本,因为对于那些浏览器,无论使用哪个按钮,click事件的which属性总是返回。0所以我写了一个 jQuery 插件jquery.whichclick来触发额外的事件:leftclick, rightclick,middleclickanyclick- 所有这些都报告正确的event.which和所有的 bind stopPropagation,stopImmediatePropagation以及随后preventDefaultclick事件。

根据您的其余代码,该插件将允许您使用:

$( document ).on( 'middleclick', function( e ){
    e.preventDefault();
} );

或者:

$( document ).on( 'anyclick', function( e ){
    if( e.which === 2 ){
        e.preventDefault();
    }
    else {
        // Other conditions you may be looking for...
    }
} );

但是,如果您不关心 IE 支持,那就太过分了——按照其他人的建议去做!

于 2013-09-24T09:16:20.550 回答
0

您正在寻找的是这种情况:

    如果(e.which == 2){
        // 防止默认行为
    }

于 2013-09-24T08:45:50.447 回答