如何解决使用 Chrome,window.open() 操作取决于 shift 键
由于 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+单击链接在新窗口中打开它的 Chrome 约定。此应用程序的最终用户点击的是 SVG 元素,不是链接,并且所有修饰符(Shift、Cntl 等)都可供他们配置功能。然而,Chrome 浏览器正在根据之前的一些鼠标操作更改 window.open()
调用的功能,这一事实正在做出一个巨大的假设,即他们要么点击了链接,要么甚至意识到这相当于点击在某个链接上。
解决方法
似乎解决方案是将操作(在代码中)与先前的用户操作分离,最简单的方法是将它们放入一个非常短的计时器(小于时间片量子但足以防止竞争条件)。
例如:
if (!ev.ctrlKey && !ev.shiftKey && !ev.altKey) { //click
setTimeout (function() { window.open('image.png','_blank'); },20);
ev.preventDefault(); return;
}
所有四种情况然后执行相同,并且可以被应用程序代码利用而没有不需要的语义。
我不确定 Chrome 如何链接这些操作-动作细节,因为它们似乎不在事件对象中,但这种方法也解决了另一个问题——Ctrl+单击打开一个新选项卡但不转移焦点,这与普通点击不同——也可能与其他浏览器中的点击不同(我在想 IE,这里是)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。