javascript - 防止在同一选项卡中打开链接,但允许在新选项卡中打开

标签 javascript dom-events

为了提高一些大型网络应用程序的性能,我创建了一个更新,将它们转换为单页应用程序。仅使用 JS/jQuery;到目前为止,引入 Angular、React、Meteor 等似乎没什么用。然而,beta 测试揭示了一个问题,即(废话)有时用户会想要在新选项卡/窗口中打开某些内容。相关交互式元素目前是没有 href 属性的 anchor ,因此目前无法在新选项卡中打开。

我的理解是,如果我将 ahrefpreventDefault() 一起使用,用户仍然无法在新选项卡中打开。

我考虑在交互元素旁边放置“在新选项卡中打开”复选框,并且考虑了一些其他方法,这些方法需要人们学习新的、惯用的交互模式。 坏主意。

现在,我想尝试使用 onbeforeunload 事件处理程序来防止更改当前窗口的位置,而是影响对当前屏幕的所需更改。我相信这不会阻止在新选项卡中打开,因为在新选项卡中打开不会触发卸载事件。

我不是第一个尝试解决这个问题的人,但我也找不到任何相关信息。任何人都知道如何防止在同一选项卡中打开,同时允许在新选项卡中打开,同时不强制人们学习新的交互模式?有人有理由相信使用 onbeforeunload 事件处理程序不允许我实现这一目标吗?

更新

如果它对将来的任何人有帮助,下面是我开发的内容。感谢@Kiko Garcia;我没有想到人们可以检测到使用的是哪个鼠标按钮。在 Firefox 54、Chrome 57、Edge、IE 11(全部在 Windows 10 上)、iOS10 的 Safari 和 Android 7 的 Android 浏览器上进行了测试。(下周将在 Mac 上进行测试,但假设目前情况良好。)

// track whether or not the Control key is being pressed
var controlKeyIsPressed = 0;

$(document).keydown(function(keyDownEvent) {
    if(keyDownEvent.which == "17") {
        controlKeyIsPressed = 1;
    }
});

$(document).keyup(function(){
    controlKeyIsPressed = 0;
});

// on clicking anchors of the specified type
$("a.some-class").on("click", function(clickEvent) {
    // left click only
    if (clickEvent.which == 1 && controlKeyIsPressed == 0) {
        // prevent default behaviour
        clickEvent.preventDefault();
        // perform desired changes on this screen
    // middle click
    } else if (clickEvent.which == 2) {
        // prevent default behaviour because behaviour seems to be inconsistent
        clickEvent.preventDefault();
    }
});

最佳答案

就像 this answer says您可以为不同的鼠标事件提供不同的操作。当然,例如,这可以是 window.open()location.href 更改。

有了它,你可以做类似的事情:

  • 左键单击:更改位置.href
  • 中键单击:打开新窗口
  • 右键单击:打开自定义菜单
$(document).mousedown(function(e){
switch(e.which)
{
    case 1:
        //left Click
    break;
    case 2:
        //middle Click
    break;
    case 3:
        //right Click
    break;
}
return true;// to allow the browser to know that we handled it.
});

尝试一下

请注意,我刚刚粘贴了答案的代码。您应该适应您的标记名和可用性

关于javascript - 防止在同一选项卡中打开链接,但允许在新选项卡中打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280100/

相关文章:

javascript - 使用 knockoutJS 时出现错误可见

javascript - GWAN 正在修改 jquery.min.js 报错

java - 如何在点击vaadin中的链接时设置值

javascript - 是否有 html "for"属性事件标志?

javascript - 将 jQuery 事件应用于所有类元素?

javascript - document.readyState 在 Firefox 和 Chrome 中不起作用

javascript - jsdoc自动使用描述字段

Javascript:按顺序遍历递归混淆的二叉搜索树

javascript - 如何在一个组件vue上创建多个图表

javascript - 单击返回按钮 ID - JavaScript