25

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

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

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

4

3 回答 3

35

在这里推测,但稍后会从 Mac 上确认。这已被确认可以在 Mac 上运行。

Win ctrl+click 或 Mac command+click 被“正常”点击监听器拾取,就像使用任何其他修饰键(alt+click、shift+click 等)的点击一样。

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

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

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

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

更新:

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

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

if (e.isDefaultPrevented() || e.metaKey || e.ctrlKey) {
    return;
}
于 2012-05-30T01:40:22.563 回答
6

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

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

于 2012-05-20T03:43:56.277 回答
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_);)并将其替换为检查命令单击并避免覆盖它们的修改版本。

于 2012-05-25T09:38:59.300 回答