按住Command键单击不会打开新选项卡,但会单击鼠标中键

在我的网站上,这是一个使用Sammy.js和jQuery的单页JS站点,当我用鼠标中键单击链接时,链接将在新选项卡中打开。 但是当我点击Mac时,它没有。 这种情况在Firefox和Chrome中都会发生,因此我认为它必须以某种方式符合规范。

这发生在Macbook Air上(所以触控板+命令按钮)。 大多数网站工作得很好,命令点击与普通的中间点击相同。

自己尝试一下: https : //circleci.com 。 在“关于”,“主页”和“联系人”之间进行命令单击,您应该会遇到问题 – 它们不会在新选项卡中打开。

在这里猜测,但稍后将从Mac确认。 这已被证实适用于Mac。

Win ctrl +单击或Mac命令+单击被“正常”单击侦听器拾取,就像点击任何其他修改键(alt +单击,Shift +单击等)。

这尤其令人困惑,因为在Mac上按住ctrl +单击可以解释为右键单击操作系统级别。 另一方面,Command-click 不会被解释为中键单击,而是浏览器首选项。

假设您没有专门依赖于修改后的点击的现场function,那么从点击侦听器中排除此类事件是合适的,而是允许它们冒泡以由浏览器本地处理。 鉴于处于类似情况的某人的经验,您应该能够将以下内容添加到单击处理程序(可能是Brilliand指出的库级别的委托):

if (e.metaKey || e.ctrlKey) return; 

当在处理程序的开头添加e引用当前的click事件时,这应该绕过任何后续的e.preventDefault();

更新:

它确实有效! 在这个相当简约的小提琴中 ,我能够识别命令点击或控制点击的时间,以避免执行其余的点击处理程序,其中包括ajax-fetching内容和e.preventDefault(); 。 这允许在Mac上“按预期”处理命令单击,即在新选项卡中打开链接。

考虑到这一发现,现在应该阅读这些内容

 if (e.isDefaultPrevented() || e.metaKey || e.ctrlKey) { return; } 

这里有一些有趣的见解: https : //groups.google.com/forum/#! msg / mozilla.dev.usability / H1qLTur4EFc / gXH007CAPk8J

显然你正在使用的JS可以preventDefault() cmd +点击,而中间点击不受影响。 查阅JS / Site框架的文档。

这是sammy.js的相关代码:

 // bind to link clicks that have routes $('a').live('click.history-' + this.app.eventNamespace(), function(e) { if (e.isDefaultPrevented()) { return; } var full_path = lp.fullPath(this); if (this.hostname == window.location.hostname && app.lookupRoute('get', full_path)) { e.preventDefault(); proxy.setLocation(full_path); return false; } }); 

简介:如果有人点击链接,请使用sammy.js的行为覆盖标准链接行为,即更改当前页面以显示目标页面的内容而不显示实际页面。 根据dakdad的链接,click事件可以捕获命令单击(与中键单击不同),并且可以覆盖。

要解决此问题,您可以删除sammy.js的事件处理程序(使用$('a').die('click.history-' + _sammy_event_namespace_); )并将其替换为检查命令单击并避免覆盖的修改版本他们。