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

Pau*_*gar 25 javascript mouse jquery singlepage sammy.js

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

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

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

o.v*_*.v. 34

在这里猜测,但稍后将从Mac确认. 这已被证实可以在Mac上运行.

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

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

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

if (e.metaKey || e.ctrlKey) return;
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

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

if (e.isDefaultPrevented() || e.metaKey || e.ctrlKey) {
    return;
}
Run Code Online (Sandbox Code Playgroud)


dak*_*dad 6

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

显然,您使用的JS可以使用preventDefault()cmd +单击,而中间单击不受影响.查阅JS/Site框架的文档.


Bri*_*and 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;
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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