jquery 命令单击不会打开新选项卡,但中键单击会

olqngx59  于 2023-10-17  发布在  jQuery
关注(0)|答案(4)|浏览(119)

在我的网站上,这是一个使用Sammy.js和jQuery的单页JS网站,当我用鼠标中键单击链接时,链接会在新选项卡中打开。但是当我在Mac上按下命令时,它就不会了。这在Firefox和Chrome中都有发生,所以我认为它一定是在某种程度上符合规范的。
这发生在MacBook Air上(所以触控板+命令按钮)。大多数网站工作正常,但命令点击是相同的正常中键点击。
你自己试试吧:https://circleci.com.在“关于”、“主页”和“联系人”之间按下Command键,你应该会遇到这个问题--它们不会在新选项卡中打开。

kuhbmx9i

kuhbmx9i1#

在这里推测,但稍后将从Mac确认。这已经被证实是在Mac上工作。
Win +click或Mac命令+click会被一个“正常”的点击监听器接收,就像使用任何其他修改键(alt+click,shift+click等)的点击一样。
这是特别令人困惑的,因为在Mac* 上的点击+单击 * 会被解释为操作系统级别的右键单击。另一方面,命令单击不会被解释为中键单击,而是浏览器首选项。
假设您没有专门依赖于修改后的点击的站点内功能,则应该将此类事件从点击侦听器中排除,而是允许它们冒泡以由浏览器进行本机处理。根据someone in the similar situation的经验,您应该能够将以下内容添加到点击处理程序(可能是Brilliand指出的库级别上的委托):

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

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

更新:

真的有用!在this rather minimalistic fiddle中,我能够识别命令单击或控件单击,以避免执行单击处理程序的其余部分,包括ajax获取内容和e.preventDefault();。这允许在Mac上“按预期”处理命令单击,即在新标签页中打开链接。
考虑到这一结论,这些行现在应改为:

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

0vvn1miw2#

这里有一些有趣的见解:https://groups.google.com/forum/#!msg/mozilla.dev.usability/H1qLTur4EFc/gXH007CAPK8J
显然,你正在使用的JS可以preventDefault()命令+点击,而中键点击不受影响。参考你的JS/Site框架的文档。

hsvhsicv

hsvhsicv3#

下面是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_);),并将其替换为修改后的版本,该版本检查命令单击并避免覆盖它们。

piv4azn7

piv4azn74#

我在寻找类似问题的解决方案时发现了这个线程。我在路透社网站上看到了类似的问题。

**问题行为:**某些网站会拦截MacOS(所有浏览器)上的Command(命令)+Click,并将当前选项卡导航到我单击的链接,而不是像预期的那样在新选项卡中打开单击的链接。

我创建了一个用户脚本,它允许Command + click在新选项卡中打开,并防止当前选项卡更改。您可以使用ViolentMonkey(TamperMonkey的开源替代品)或任何其他首选的userscript管理器运行该脚本。

// ==UserScript==
// @name        Force Links on All Websites to Open in New Tab When Command/Ctrl + Clicked
// @namespace   Violentmonkey Scripts
// @match       *://*/*
// @grant       none
// @version     1.0.1
// @author      Elijah Shackelford <eshack94>
// @description Forces links on all websites to open in a new tab when Command/Ctrl + Clicked, without navigating the original tab
// ==/UserScript==

document.addEventListener('click', function(event) {
    if ((event.metaKey || event.ctrlKey) && event.target.tagName === 'A') {
        event.preventDefault();
        event.stopPropagation();
        window.open(event.target.href, '_blank');
    }
}, true); // Added "true" for capturing phase, to ensure our listener acts before any others

希望这能帮助将来遇到同样问题的人。

相关问题