JS:如何防止中间点击的默认处理?

时间:2013-09-24 08:35:10

标签: javascript preventdefault

这似乎是一个荒谬的简单问题,但似乎更难......

我想阻止默认处理中间点击。我创建了一个JSFiddle并投入stopPropagationstopImmediatePropagationpreventDefaultreturn false - 就像这样:

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

但是中间点击被触发了。顺便说一句,它是在我发布中间按钮时被解雇的。这是JSFiddle: http://jsfiddle.net/Gq4p9/4/

在Chrome 29,Firefox 23和IE11上进行了测试。

我希望有人能够找到,为什么这个脚本不会阻止默认处理。

3 个答案:

答案 0 :(得分:4)

正如您在评论中提到的那样,如果您将 jQuery object 作为选择器传递

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

虽然APIselector预计是字符串类型。

Fiddle


你也可以随时使用普通的javascript click eventListener。

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

继承人Fiddle

答案 1 :(得分:2)

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

虽然目前的解决方案完全正确,但它们不适用于IE8及更低版本,因为对于那些浏览器,click事件的which属性始终返回0,无论哪个按钮是用过的。所以我写了一个jQuery插件, jquery.whichclick 来触发额外的事件:leftclickrightclickmiddleclickanyclick - 全部报告正确的event.which,并将stopPropagationstopImmediatePropagationpreventDefault绑定到随后的click事件。

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

$( 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的支持,那就太过分了 - 只要按照其他人的建议去做吧!

答案 2 :(得分:0)

你正在寻找的是这个条件:


    if( e.which == 2 ) { 
        // prevent default behaviour
    }