使用中键触发onclick事件


89

我正在使用onclick哈希链接的事件来打开<div>弹出窗口。但是,单击中键不会触发onclick事件,而只会获取href链接的属性值,并将URL加载到新页面中。如何使用中键打开<div>弹出窗口?


15
当鼠标中键没有触发onclick事件时,我仍然不知道如何解决该问题。
托马什Zato -恢复莫妮卡

3
@TomášZato浏览器不会通过单击中键触发“ click”事件,但可能会触发“ mouseup”事件。然后,javascript框架可能会将其绑定到“点击”操作,以使您感到困惑。我建议阅读unixpapa.com/js/mouse.html
rds

Answers:


64

编辑

该答案已被弃用,不适用于Chrome。您很可能最终会使用auxlink事件,但请参考以下其他答案。

/编辑


beggs的答案是正确的,但是听起来您想阻止默认的中间点击操作。在这种情况下,请包括以下内容

$("#foo").on('click', function(e) {
   if (e.which == 2) {
      e.preventDefault();
      alert("middle button"); 
   }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a id="foo" href="http://example.com">middle click me</a>

preventDefault()将停止事件的默认操作。


19
请记住,它.live已被弃用并删除,以支持.on
Naftali aka Neal

2
对我来说,FF仅适用于mousedown事件。点击事件称此为scr.hu/1kig/su5c9
l00k 2015年

1
是否有任何跨浏览器常量2
fracz

11
在Chrome中看到55这个不再工作12这个问题
billc.cn

1
当问题是中间点击不会触发点击事件开始时,该如何解决?
Drazen Bjelovuk '17年

31

为了检测到单击中键/鼠标滚轮,您必须使用event auxclick。例如:

<a href="https://example.com" onauxclick="func()" id="myLink"></a>

然后在您的脚本文件中

function func(e) {
  if (e.button == 1) {
    alert("middle button clicked")
  }
}

如果要从JavaScript(不使用HTML属性onauxclick)进行操作,请addEventListener转到元素:

let myLink = document.getElementById('myLink')
myLink.addEventListener('auxclick', function(e) {
  if (e.button == 1) {
    alert("middle button clicked")
  }
})
<a id="myLink" href="http://example.com">middle click me</a>

结帐有关的MDN页面auxclick事件在这里


注意:onauxclick可以使用,但不会在新标签页中打开链接...
Jonathan Laliberte

2
这是在Chrome中实际有效的唯一答案。如果您需要鼠标右键的“ click”事件,则可以使用“ contextmenu”(尽管不仅可以通过右键单击来触发它):developer.mozilla.org/en-US/docs/Web/API/Element/…
Humpparitari

1
结合以上答案,可以防止右键单击按if(event.button==1)子句,这是唯一有效的答案。
好友

请注意,您需要同时使用auxclick事件和检查的值e.button == 1。我编辑了答案。
Flimm

26

您可以使用

事件按钮

以确定单击了哪个鼠标按钮。

返回一个整数值,指示更改状态的按钮。

  • 0为标准的“单击”,通常为向左按钮
  • 1为中间按钮,通常是滚轮单击
  • 2为右键,通常单击鼠标右键

请注意,Internet Explorer中未遵循此约定:有关详细信息,请参见QuirksMode。

根据指示设备的配置方式,按钮的顺序可能会有所不同。

也看了

单击了哪个鼠标按钮?

有两个属性可以找出单击了哪个鼠标按钮:哪个和按钮。请注意,这些属性并不总是在单击事件上起作用。为了安全地检测到鼠标按钮,您必须使用mousedown或mouseup事件。

document.getElementById('foo').addEventListener('click', function(e) {
  console.log(e.button);
  e.preventDefault();
});
<a id="foo" href="http://example.com">middle click me</a>


4
我建议使用,event.which因为它已在jQuery源中的所有浏览器中标准化-2756行if ( !event.which && event.button ) event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
Russ Cam

2
@RussCam但是,MouseEvent.which未在任何规范MouseEvent.button中定义,但在DOM L2事件中定义。
Oriol

@Oriol是正确的,但在不同的浏览器供应商中实现方式有所不同。OP用jQuery标记了这个问题,所以这就是为什么我建议使用jQuery,event.which但应该对此进行详细说明,但这MouseEvent.which并不是官方规范的一部分。
Russ Cam

@rahul,具有7个以上按钮的游戏鼠标又如何呢?egg-tech.com/blog/images/mouse%20buttons.jpg
Pacerier,

实际上,这不适用于Firefox或Chrome浏览器,仅适用于首次点击。见12这个问题
Flimm

8

我通常讨厌人们提供替代方案而不是解决方案,但是由于已经提供了解决方案,因此我将打破自己的规则。

忽略中键功能的网站往往会给我造成很大的困扰。我通常会单击鼠标中键,因为我想在新选项卡中打开新内容,同时保持当前内容的通畅视图。任何时候只要您可以保留中单击功能,并通过clicked元素的HREF属性提供相关内容,我都坚信这是您应该做的。


但是,如果您的网页上有标签页并希望与浏览器中的行为相同,该怎么办?middleclick然后应关闭现有的标签。
cmxl

6

jQuery .which在事件上提供了一个属性,该属性将单击按钮ID从左到右分别为1、2、3。在这种情况下,您需要2。

用法:

$("#foo").live('click', function(e) { 
   if( e.which == 2 ) {
      alert("middle button"); 
   }
}); 

Adamantium的答案也可以,但是您需要注意IE,因为他指出:

$("#foo").live('click', function(e) { 
   if((!$.browser.msie && e.button == 1) || ($.browser.msie && e.button == 2)) { 
     alert("middle button"); 
   } 
});

还要记住,.button属性是0索引而不是1索引.which


我可以覆盖Mozilla浏览器的功能!!例如,在左键单击它会打开一个弹出窗口...。但是对于中键单击,它不会打开一个弹出窗口,并且会打开一个新选项卡,其中弹出窗口不会打开..所以我要覆盖的中键单击功能mozilla ....
Sadesh Kumar N

Mozilla的设置可以在新标签页而不是新窗口中打开所有弹出窗口。如果用户启用了此选项,那么我认为您无能为力。如果不是这种情况,您可以发布一些代码或指向问题页面的链接吗?
要求

这在Firefox和Chrome等浏览器中不起作用。
Flimm

6

这个问题有点老了,但是我找到了一个解决方案:

$(window).on('mousedown', function(e) {
   if( e.which == 2 ) {
      e.preventDefault();
   }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="http://example.com">middle click me</a>

Chrome无法触发鼠标滚轮的“点击”事件

在FF和Chrome中工作


我不想假设您的用例,但是我敢打赌,很多人实际上需要'mouseup'事件。它也可以与鼠标中键一起使用。
Bojidar Stanchev

当我在Firefox和Chrome中尝试此操作时,即使e.preventDefault()被调用,它也不会阻止在新选项卡中打开链接的默认行为。
Flimm

5

正确的方法是使用.on,因为.live已弃用,然后将其从jQuery中删除

$("#foo").on('click', function(e) { 
   if( e.which == 2 ) {
      e.preventDefault();
      alert("middle button"); 
   }
});

或者,如果您希望获得“实时”的感觉并且#foo不在文档开始页面上:

$(document).on('click', '#foo', function(e) { 
   if( e.which == 2 ) {
      e.preventDefault();
      alert("middle button"); 
   }
});

原始答案


该事件click不适用于Firefox和Chrome等浏览器中的鼠标中键。
Flimm

它曾经@Flimm
Naftali又名Neal

是的 对于过期的答案,堆栈溢出没有好的解决方案。恐怕我不得不投票,因为“此答案不再有用”。更糟糕的是,由于答案过期,固定答案可能会受到成百上千次的否决,并且如果OP没有响应,它将永远保持固定状态。
Flimm

提出一个新问题:-)(请参考这个问题,说它已经过时了,您想要2020年的答案)。但是也许还可以使用mousedown / mouseup事件吗?
Naftali又名Neal

即使我这样做,当我来自搜索引擎时,像我一样的人仍然会遇到这个答案,并且会被固定的错误答案所迷惑。
Flimm

3

我知道我参加晚会很晚,但是对于那些仍然在处理中间点击时仍然遇到问题的人,请检查是否委托该活动。在授权的情况下,该click事件不会触发。比较:

这适用于中间点击:

$('a').on('click', function(){
  console.log('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="http://example.com">middle click me</a>

这不适用于中间点击:

$('div').on('click', 'a', function(){
  alert('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <a href="http://example.com">middle click here</a>
</div>

如果您仍然需要使用事件委托来跟踪中间点击,那么相应jQuery票证中所述的唯一方法就是使用mousedownmouseup代替。像这样:

这适用于委派的中间点击:

$('div').on('mouseup', 'a', function(){
  console.log('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <a href="http://example.com">middle click me</a>
</div>

在这里在线查看


实际上,click不适用于第一个示例中的中间点击。
Flimm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.