我正在开发一个书签,它通常在当前页面中完成所有工作,但偶尔需要打开一个新窗口(主要用于登录流程)。我有这个主要工作,但铬正在做一些意想不到的事情。
在大多数浏览器中,我正在制作的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>
如果我将延迟保留在1000
,它会正常打开。但是,如果我把它增加到3000
,它会在另一个样式窗口中打开:
在较慢的连接上,我的bookmarklet的初始化可能需要一秒以上(需要加载一些库并进行凭据检查),因此我偶尔会超出此时间范围,导致浏览器和尝试之间的行为不一致。
有没有办法告诉chrome打开一个标准窗口,或者这只是我必须忍受的一些强制行为?
答案 0 :(得分:0)
此解决方案仅适用于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秒后打开链接)
http://jsbin.com/ihuwew/1/edit
我也毫不拖延地测试了这一点(直接在window.onload
事件中)并且它没有被弹出窗口阻止程序阻止