【问题标题】:Using Chrome, window.open() action depends on shift key使用 Chrome,window.open() 操作取决于 shift 键
【发布时间】:2021-01-20 12:58:38
【问题描述】:

由于 Chrome 公然忽略了 window.open() 的记录功能,因此我正在拉扯我的头发,有时会在新窗口而不是新标签页中打开。有许多类似的问题,但似乎没有一个将其与 Shift 键的使用联系起来。

下面的代码打开相同的图像文件以响应单击、ctrl+单击、shift+单击或 alt+单击操作。代码希望在新选项卡中打开它们,除了 shift+click 之外,所有这些都实现了这一点,无论我如何尝试更改 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>

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

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

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

【问题讨论】:

    标签: javascript html google-chrome event-handling


    【解决方案1】:

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

    例如:

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

    所有四种情况都执行相同的操作,并且可以由应用程序代码使用,而不会产生不需要的语义。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多