命令点击不会打开一个新标签,但中间不点击(Command-click doesn't ope

2019-07-29 10:52发布

在我的网站,这是一个使用Sammy.js和jQuery,当我中间用鼠标点击一个链接一个页面JS网站,链接在新标签中打开。 但是,当我在Mac上按Command键,它没有。 这发生在Firefox和Chrome浏览器,所以我认为它必须,按照规范以某种方式。

这发生在MacBook Air上(所以触控板+命令按钮)。 大多数网站工作得很好,虽然,使用命令点击是等同于正常的中间点击。

尝试一下自己: https://circleci.com 。 和“约”,“家”和“接触”之间的命令,单击您要遇到的问题 - 他们不打开新的标签页。

Answer 1:

投机在这里,但后来从Mac将确认。 这已被证实是工作在Mac上。

赢Ctrl +单击或Mac命令+点击获得由“正常”的点击收听回升,就像任何其他修改键点击(ALT +点击,移+点击等)。

这是特别令人困惑,因为一个Ctrl +单击在Mac上被解释为在操作系统级别右键单击。 命令单击,在另一方面, 被解释为中间点击而是一个浏览器偏好。

假设你没有在现场的功能,特别是依赖于修改的点击,这将是适当的,从点击听众排除这样的事件,而应该让他们冒泡由浏览器本身处理。 鉴于这些经验, 有人在类似的情况 ,你应该能够增加点击处理程序(可能是由Brilliand指出了图书馆级代表)的情况如下:

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

当与处理程序的开头添加e指的是目前的点击事件,这应该规避任何以下e.preventDefault();

更新:

它的实际工作! 在这个相当简约小提琴 ,我能够认识到,当命令单击或控制点击,从而避免执行单击处理程序,包括AJAX,获取的内容和其余e.preventDefault(); 。 这允许命令单击要处理“意为”在Mac上,即打开一个新标签的链接。

有了这个发现一点, 这些行现在应该读

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


Answer 2:

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

显然,JS使用的是可以preventDefault()的CMD +单击而中点击不受影响。 请咨询您的JS /网站框架的文档。



Answer 3:

下面是从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_); ),并与检查命令点击,避免了压倒一切的修改后的版本替换它他们。



文章来源: Command-click doesn't open a new tab, but middle-click does