在我的网站上,这是一个使用 Sammy.js 和 jQuery 的单页 JS 网站,当我用鼠标中键单击链接时,该链接会在新选项卡中打开。但当我在 Mac 上按住命令单击时,却没有。这种情况在 Firefox 和 Chrome 中都会发生,所以我认为它一定在某种程度上符合规范。

这种情况发生在 Macbook Air 上(即触控板 + 命令按钮)。不过,大多数网站都可以正常工作,命令单击与普通的中键单击相同。

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

有帮助吗?

解决方案

此处推测,但稍后将通过 Mac 进行确认。 这已被证实可以在 Mac 上运行。

Win ctrl+单击或 Mac 命令+单击会被“正常”单击侦听器拾取,就像使用任何其他修饰键(alt+单击、shift+单击等)进行的单击一样。

这特别令人困惑,因为 ctrl+click 在苹果电脑上 被解释为在操作系统级别上右键单击。另一方面,按住 Command 键单击是 不是 解释为中键单击,而是浏览器首选项。

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

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

当添加到处理程序的开头时 e 引用当前的点击事件,这应该避免以下任何事件 e.preventDefault();

更新:

它确实有效!在 这个相当简约的小提琴, ,我能够识别何时单击命令或单击控制,以避免执行其余的单击处理程序,其中包括 ajax 获取内容和 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的链接,点击事件捕获了命令单击(与中间单击单击单击),可以覆盖。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top