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

时间:2012-05-18 22:11:59

标签: javascript jquery mouse singlepage sammy.js

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

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

亲自尝试:https://circleci.com。在“about”,“home”和“contact”之间按住Command键并单击,您应该会遇到问题 - 它们不会在新标签中打开。

3 个答案:

答案 0 :(得分:34)

在这里推测,但稍后会从Mac确认。这已被证实可以在Mac上使用。

Win ctrl + click或Mac命令+点击被“普通”点击监听器选中,就像点击任意其他修改键一样(alt +点击,切换+点击等)。

这尤其令人困惑,因为在Mac 上按住ctrl +单击会被解释为右键单击操作系统级别。另一方面,按住Command键,被解释为中间点击,而是浏览器偏好。

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

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

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

更新

它确实有效!在someone in the similar situation中,我能够识别命令单击或控制单击的时间,以避免执行包含ajax获取内容和e.preventDefault();的其余单击处理程序。这允许在Mac上“按预期”处理命令单击,即在新选项卡中打开链接。

考虑到这一发现,this rather minimalistic fiddle现在应该阅读

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

以下是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的链接,点击事件会捕获命令点击(与中间点击不同),并且可以覆盖。

对于变通方法,您可以删除sammy.js的事件处理程序(使用$('a').die('click.history-' + _sammy_event_namespace_);)并将其替换为检查命令单击并避免覆盖它们的修改版本。