Javascript 延迟后在chrome中打开标准窗口

Javascript 延迟后在chrome中打开标准窗口,javascript,google-chrome,popupwindow,Javascript,Google Chrome,Popupwindow,我正在开发一个bookmarklet,它通常在当前页面中完成所有工作,但偶尔需要打开一个新窗口(主要用于登录流)。我有这个主要工作,但chrome正在做一些意想不到的事情 我正在进行的window.open调用会在大多数浏览器中生成一个标准的新窗口/选项卡,但在chrome中,它会在一个不同样式的窗口中打开。该窗口没有选项卡和只读URL栏 chrome的行为似乎是基于鼠标点击打开的距离。下面是一些简单的代码来演示: <!DOCTYPE html> <html> <

我正在开发一个bookmarklet,它通常在当前页面中完成所有工作,但偶尔需要打开一个新窗口(主要用于登录流)。我有这个主要工作,但chrome正在做一些意想不到的事情

我正在进行的
window.open
调用会在大多数浏览器中生成一个标准的新窗口/选项卡,但在chrome中,它会在一个不同样式的窗口中打开。该窗口没有选项卡和只读URL栏

chrome的行为似乎是基于鼠标点击打开的距离。下面是一些简单的代码来演示:

<!DOCTYPE html>
<html>
  <head>
    <title>Chrome window.open Test</title>
    <script>
      function startOpen() {
        var delay = Number(document.getElementById('delay').value);
        setTimeout(openWindow, delay);
      }

      function openWindow() {
        window.open('http://www.google.com', '_blank');
      }
    </script>
  </head>
  <body>
    <input type="text" id="delay" value="1000"></input>
    <input type="button" value="Open" onclick="startOpen()"></input>
  </body>
</html>

Chrome window.open测试
函数startOpen(){
var delay=Number(document.getElementById('delay').value);
设置超时(打开窗口,延迟);
}
函数openWindow(){
打开窗户http://www.google.com","空白",;
}
如果我将延迟设置为
1000
,它将正常打开。但是,如果我将其设置为
3000
,它将在其他样式窗口中打开:

在较慢的连接上,bookmarklet的初始化可能需要一秒钟以上的时间(需要加载几个库并进行凭据检查),因此我偶尔会超出此时间范围,使浏览器和尝试之间的行为不一致


有没有办法告诉chrome打开一个标准窗口,或者这只是我不得不忍受的一些强迫行为?

此解决方案仅在chrome中有效,它通过在元素上创建锚定并模拟Shift+Click事件来工作:

function openLinkInWindow(url) {
    var anchor = document.createElement("a");
    anchor.href = url;
    document.body.appendChild(anchor);

    var evt = document.createEvent("MouseEvents");
    evt.initMouseEvent("click", true, true, window,
    0, 0, 0, 0, 0, false, false, 

    true, // SHIFT key down

    false, 0, null);
    anchor.dispatchEvent(evt);

    anchor.parentNode.removeChild(anchor);
}
用法:

  openLinkInWindow("http://www.google.com");
工作示例:(延迟2秒后打开链接)


我还测试了它,没有延迟(直接在
窗口中。onload
事件),它没有被弹出窗口拦截器阻止吹毛求疵:
input
元素没有结束标记。有趣的是,当我将计时器设置为任何超过1ec的值时,它会被弹出窗口拦截器阻止。这是你的问题的答案。对,弹出窗口拦截器也抓住了这个问题。我允许我的域中的弹出窗口走到这一步。我希望根本不触发它们,但它需要一些需要更多用户点击的用户体验更改,如果可能的话,我希望避免这种情况。我希望bookmarklet的用户能够理解弹出窗口,尽管这一切还不确定。在选择我将要做的事情之前,试着弄清楚我能做什么。是的,那只是一个旁注。我个人会使用模式iframe或类似的工具,而不是打开新窗口,这更难被阻止,而且跨浏览器。我确实使用了模式iframe,但出于安全原因,我们的登录页面不允许使用框架。因此,如果用户没有登录,我需要触发一个新的登录窗口。我没有想过假装一个事件。有没有跨浏览器的方法可以做到这一点?我在其他浏览器上尝试了相同的方法,但尽管我成功地向元素发送了“单击”,但我无法模拟按下shift键。(编辑示例以注释模拟shift键的位置)