【问题标题】:Triggering onclick event using middle click使用中键触发 onclick 事件
【发布时间】:2010-12-20 05:24:11
【问题描述】:

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

【问题讨论】:

  • 我还是不明白问题是怎么解决的,当中间点击没有触发onclick事件时。
  • @TomášZato 浏览器不会通过中键触发“click”事件,但它们可能会触发“mouseup”事件。然后 javascript 框架可能会将其绑定到“单击”操作以使您感到困惑。推荐阅读unixpapa.com/js/mouse.html

标签: javascript jquery


【解决方案1】:

编辑

此答案已被弃用,并且 在 Chrome 上不起作用。您很可能最终会使用auxclick event,但请参阅下面的其他答案。

/编辑


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() 将停止事件的默认动作。

【讨论】:

  • 请记住,.live 已被弃用并删除,取而代之的是 .on
  • 对我来说,FF 仅适用于 mousedown 事件。点击事件调用这个东西scr.hu/1kig/su5c9
  • 2 是否有任何跨浏览器常量?
  • 这在 Chrome 55 中不再有效。请参阅 12this question
  • 当问题是中间点击不触发点击事件开始时,这是如何解决的?
【解决方案2】:

要检测到中键单击/鼠标滚轮按钮,您必须使用事件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")
  }
})
&lt;a id="myLink" href="http://example.com"&gt;middle click me&lt;/a&gt;

查看有关 auxclick 事件 here 的 mdn 页面。

【讨论】:

  • 注意:onauxclick 可以工作,但不会在新标签页中打开链接...
  • 这是唯一适用于 Chrome 的答案。如果您需要鼠标右键的“单击”事件,则可以使用“上下文菜单”(尽管它不仅通过右键单击触发):developer.mozilla.org/en-US/docs/Web/API/Element/…
  • 结合上面的答案,您可以通过if(event.button==1)子句防止右键捕获,这是唯一有效的答案。
  • 请注意,您需要同时使用auxclick 事件,并检查e.button == 1 的值。我编辑了答案。
【解决方案3】:

你可以使用

event.button

识别单击了哪个鼠标按钮。

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

  • 0 表示标准的“点击”,通常是左键
  • 1 表示中间按钮,通常是滚轮点击
  • 2代表右键,通常是右键

请注意,Internet Explorer 不遵循此约定:请参阅 QuirksMode 了解详情。

按钮的顺序可能会有所不同,具体取决于指针设备的配置方式。

另请阅读

Which mouse button has been clicked?

有两个属性可供查找 出了哪个鼠标键 单击:哪个和按钮。请注意 这些属性并不总是 处理点击事件。为了安全 检测您必须使用的鼠标按钮 mousedown 或 mouseup 事件。

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

【讨论】:

  • 我建议使用event.which,因为它已在 jQuery 源代码中跨浏览器标准化 - 第 2756 行 - if ( !event.which &amp;&amp; event.button ) event.which = (event.button &amp; 1 ? 1 : ( event.button &amp; 2 ? 3 : ( event.button &amp; 4 ? 2 : 0 ) ));
  • @RussCam 但是,MouseEvent.which 没有在任何规范中定义,但MouseEvent.button 在 DOM L2 事件中定义。
  • @Oriol 正确,但在不同的浏览器供应商中实现方式不同。 OP 用 jQuery 标记了这个问题,所以这就是为什么我建议使用 event.which 但应该详细说明 MouseEvent.which 不是官方规范的一部分。
  • @rahul,超过 7 个按钮的游戏鼠标怎么样? egg-tech.com/blog/images/mouse%20buttons.jpg
  • 实际上,这在 Firefox 或 Chrome 等浏览器中不起作用,仅适用于主要点击。请参阅12this question
【解决方案4】:

这个问题有点老了,但我找到了解决办法:

$(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'事件。它也适用于鼠标中键。
  • 当我在 Firefox 和 Chrome 中尝试此操作时,它不会阻止在新选项卡中打开链接的默认行为,即使调用了 e.preventDefault()
【解决方案5】:

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-indexed 而不是像 .which 这样的 1-indexed。

【讨论】:

  • 我可以覆盖mozilla浏览器的功能吗!!例如,在左键单击时,它会打开一个弹出窗口……但对于中键单击,它不会打开一个弹出窗口,而是会打开一个新选项卡,其中弹出窗口没有打开……所以我想覆盖的中键单击功能Mozilla....
  • Mozilla 有一个设置,可以在新选项卡而不是新窗口中打开所有弹出窗口。如果用户启用了此选项,那么我不认为您可以做任何事情。如果这不是发生的情况,您可以发布一些代码或问题页面的链接吗?
  • 这在 Firefox 和 Chrome 等浏览器中不起作用。
【解决方案6】:

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

中键点击功能被覆盖的网站真的很烦我。我通常会单击鼠标中键,因为我想在新选项卡中打开新内容,同时可以畅通无阻地查看当前内容。任何时候您都可以不理会中间点击功能并通过点击元素的 HREF 属性提供相关内容,我坚信您应该这样做。

【讨论】:

  • 但是如果您的网页上有标签并且想要与浏览器中相同的行为怎么办?然后,middleclick 应该关闭现有的选项卡。
【解决方案7】:

正确的方法是使用.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"); 
   }
});

original answer

【讨论】:

  • 事件 click 不适用于 Firefox 和 Chrome 等浏览器中的鼠标中键。
  • 曾经@Flimm
  • 是的。 Stack Overflow 没有针对过时答案的好的解决方案。恐怕我不得不投反对票,因为“这个答案没有用”了。更糟糕的是,固定的答案可能有成百上千的反对票,因为它已经过时了,如果 OP 没有响应,它仍然会永远保持固定状态。
  • 问一个新问题 :-) (参考这个说它已经过时了,你想要一个 2020 年的答案)。但也可以使用 mousedown/mouseup 事件吗?
  • 即使我这样做了,像我这样的人在来自搜索引擎时仍然会遇到这个答案,并且会被固定的错误答案弄糊涂。
【解决方案8】:

我知道我参加聚会迟到了,但是对于那些仍然无法处理中间点击的人,请检查您是否委派了该活动。在委托的情况下,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 ticket 中说明,改为使用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>

See it online here.

【讨论】:

  • 实际上,click 不适用于您的第一个示例中的中间点击。
猜你喜欢
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 2010-10-21
  • 2020-01-31
  • 2013-04-30
  • 2014-06-07
相关资源
最近更新 更多