【问题标题】:Suppress click event listener if the click opens a new tab or window如果单击打开新选项卡或窗口,则禁止单击事件侦听器
【发布时间】:2018-01-01 10:29:18
【问题描述】:

有时在我的网络应用程序上,如果点击应该打开一个新窗口或标签,我想禁止点击事件侦听器。例如,我的单页应用程序具有指向另一个内容的链接。他们工作得很好,但有一个问题。如果用户单击此类链接,进行特殊单击以打开新选项卡/窗口(比如说 cmd ⌘ + 在 Mac 上单击),我不想触发事件侦听器。

通常我会这样做:

<a href="/music">Music</a>
<a href="/games">Games</a>
<a href="/about-us">About Us</a>
<a href="/contact">Contact</a>

还有一些 jQuery 魔法:

$("a[href]").click(event => {
    if (event.metaKey || event.shiftKey) {
        // Let browser handle that normally if cmd or shift is pressed
        return true;
    }

    let uri = $(event.target).attr("href");

    // My viewPage(uri) function displays content by href
    viewPage(uri);

    return false;
});

它按预期工作 - 每当使用鼠标 + 键盘快捷键打开新选项卡/窗口时,当前选项卡不受影响并出现新选项卡/窗口。

这里的问题是假设 cmd ⌘ + click 或 shift + click 实际上是快捷方式。对于不同的浏览器和系统,它们可能会有所不同。

所以这是我想问的问题:有没有可靠的方法来检测 JavaScript 中的选项卡/窗口打开请求?我发现这个功能相当重要。至少重要到可以关心。

【问题讨论】:

  • 它有什么帮助?这比我已经得到的想法更糟糕。
  • 你可以在this post找到有趣的评论。然而,可能不是您正在寻找的解决方案。
  • @bigless 这不是我问题的答案。我知道如何阅读钥匙。问题是是否触发了一些特殊事件或其他技术来捕捉即将打开的窗口/选项卡。我不认为跟踪所有浏览器和所有系统中的所有快捷方式是最好的主意,尤其是某些浏览器可能允许更改快捷方式按钮。
  • 如果您保留当前代码,则必须添加 event.ctrlKey(在 Windows 上,它会在 Chrome、Firefox 和 Opera 中打开一个新标签页)。

标签: javascript jquery html browser


【解决方案1】:

不要让它们成为锚。使它们成为跨度,并使用跨度的单击事件来设置window.location。这比找到每个人想要在新窗口中打开内容的边缘情况要容易得多——例如,右键单击链接、复制链接位置、打开新选项卡/窗口并粘贴?你永远无法用锚标签来防止这种情况发生。

【讨论】:

  • 我不想阻止打开一个新窗口。恰恰相反。实际上,我讨厌糟糕的单页应用程序禁用了许多有用的网络浏览器功能,如书签、打开新标签、正确的历史浏览等。
  • "有时在我的网络应用程序上,如果该点击应该打开一个新窗口或标签,我想抑制点击事件。"听起来像是阻止我打开一个新窗口。我稍后会看这个;得跑了。
  • 我的意思是禁止自定义事件并在这种情况下允许默认事件。我将编辑问题以使其更清楚。
  • 嗯,我理解您的担忧,但我没有看到更好的方法。响应页面的卸载事件几年前就可以解决问题,但是现在已经完全被沙箱化了,并且 DOM 中没有机制来查看链接是在本地打开还是在新选项卡/窗口中打开。我会添加对 event.ctrlKey 的检查,因为它倾向于在新选项卡中打开,而不是在 Windows 浏览器中打开新页面。
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多