使用 Chrome, window.open() 动作取决于 shift 键

Using Chrome, window.open() action depends on shift key

因为 Chrome 公然忽略了 window.open() 的记录功能,所以我对这个很生气,有时会在新的 window 而不是新选项卡中打开。有许多类似的问题,但 none 似乎已 link 将其编辑为使用 Shift 键。

下面的代码打开同一个图像文件以响应单击、ctrl+单击、shift+单击或 alt+单击操作。代码想要在新选项卡中打开它们,除了 shift+click 外,所有这些都实现了这一点,它总是打开一个新的 window,无论我如何尝试更改我的 window.open 调用。

function clickHandler(ev) {
    ev = ev || window.event;

    if (!ev.ctrlKey && !ev.shiftKey && !ev.altKey) {    //click
        window.open('image.png','_blank');
        ev.preventDefault(); return;
    }
    if (ev.ctrlKey && !ev.shiftKey && !ev.altKey) { //ctrl+click
        window.open('image.png','_blank');
        ev.preventDefault(); return;
    }
    if (!ev.ctrlKey && ev.shiftKey && !ev.altKey) { //shift+click
        window.open('image.png','_blank');
        ev.preventDefault(); return;
    }
    if (!ev.ctrlKey && !ev.shiftKey && ev.altKey) { //alt+click
        window.open('image.png','_blank');
        ev.preventDefault(); return;
    }
 }


<div onclick="clickHandler(event);"> Click here </div>

对于逐项处理(即每个部分以 return 结尾)表示歉意,但这是从一段更长的代码中提取的。我的原始代码是处理 SVG 元素上的点击操作,但这似乎无关紧要。哪个操作的配置在用户的控制下执行什么操作,因此我想让它们都按照文档(如果可能)以受控方式运行。

看起来 Google 是在给用户强加约定,而忽略了 Chrome 应该是一个通用浏览器而不是 Google 搜索的容器这一事实(对不起,偏执的咆哮结束了)。

[为澄清而编辑] 这不是专门关于 Shift+单击 link 在新的 window 中打开它的 Chrome 惯例。此应用程序的最终用户单击 SVG 元素, 而不是 link,并且所有修饰符(Shift、Cntl 等)都可供他们配置功能.然而,Chrome 浏览器正在根据先前的一些鼠标操作更改 window.open() 调用的功能,这一事实做出了一个巨大的假设,即他们要么点击了 link,要么甚至意识到这相当于点击一些 link.

似乎解决方案是将操作(在代码中)与先前的用户操作分开,最简单的方法是将它们放入一个非常短的计时器(小于时间片量程但足以防止竞争条件)。

例如:

if (!ev.ctrlKey && !ev.shiftKey && !ev.altKey) {    //click
    setTimeout (function() { window.open('image.png','_blank'); },20);
    ev.preventDefault(); return;
}

然后所有四种情况都以相同的方式执行,并且可以由应用程序代码使用而没有不需要的语义。

我不确定 Chrome 如何链接这些操作细节,因为它们似乎不在事件对象中,但这种方法也解决了另一个问题 -- Ctrl+Click 打开一个新的选项卡但不转移焦点,这与普通点击不同——可能与其他浏览器(我想是 IE,这里)。