在Chrome中强制使用window.open()创建新标签页

26

我使用window.open来在新窗口中添加不同的内容,主要是报告和自动化进程中存储的HTML。

我注意到Chrome在使用window.open()时表现非常不一致。

有些调用会创建一个新选项卡(首选行为),而有些调用则会弹出弹出窗口。

var w = window.open('','_new');
w.document.write(page_content);

page_content是来自于AJAX调用的常规HTML。 报告在头部包含一些信息,如标题、图标和一些样式表。

在IE9中,该代码会导致新标签页而不是弹出窗口,而Chrome则干脆拒绝在新标签页中显示相关内容。由于内容是敏感的商业数据,我不能在这里发布它。如果可以,我会回答问题。

我知道有些人会说这是留给用户决定的行为,但这是一个内部商业平台。我们没有时间培训所有用户如何管理弹出窗口,我们只需要它在新标签页中打开。即使是新窗口也比弹出窗口更可取,因为您无法在Chrome中对弹出窗口进行停靠。更不用说任何弹出窗口阻止代码都不会影响它。

感谢任何见解。


扔出一个疯狂的想法:window.open('data:text/html,' + escape(page_content))? 编辑:刚试了一下,不行。 - ephemient
5个回答

40

为了让页面在新标签页中打开而不是在新窗口中打开,必须在由用户操作(例如onclick)触发的回调函数内调用window.open函数。

示例:

$("a.runReport").click(function(evt) {
    // open a popup within the click handler
    // this should open in a new tab
    var popup = window.open("about:blank", "myPopup");

    //do some ajax calls
    $.get("/run/the/report", function(result) {
        // now write to the popup
        popup.document.write(result.page_content);

        // or change the location
        // popup.location = 'someOtherPage.html';
    });
});

我一直怀疑这会是这种情况(即用户交互/事件有所涉及),谢谢。 - Jaroslav Záruba
你可以立即操作弹出窗口,以便在回调函数完成之前显示“处理中”消息或其他内容。 - Matt MacLean
@maclema:我的理解是它必须是一个回调/处理程序,以响应用户操作(否则这样的预防措施很容易被规避),在这种情况下,我不明白您为什么要显示这样的消息...?但也许我没有完全理解您最后的评论。 - Jaroslav Záruba
1
var popup = window.open("about:blank", "My Page"); popup.location = 'my_page.html'; 变量弹出窗口=window.open("about:blank","我的页面"); 弹出窗口.location='my_page.html'; - shasi kanth
每当涉及到ajax时,最好使用.on而不是.click。参考:http://api.jquery.com/on/ - happy
显示剩余2条评论

3
你可以尝试这个方法:
<a href="javascript:openWindow();">open a new tab please</a>

<script>
    function openWindow(){
        var w = window.open("about:blank");
        w.document.write("heheh new page opened");
    }
</script>

0

我已经尝试过这个,并且在Chrome中运行良好。如果打开一个新选项卡是在用户操作时(例如鼠标单击),这将正常工作,没有任何问题。但是,如果代码在另一个脚本块中执行,您可能需要在Chrome中启用弹出窗口。看起来这是为了处理所有诱导点击的网站。

let newTab = window.open('', '_blank');
if (this.viewerTab == null) {
  console.log("opening in new tab to work, pop-ups should be enabled.");
  return;
}

................

newTab.location.href = viewerUrl;

0

非常简单,为了强制Chrome在新标签页中打开,使用onmouseup事件

onmouseup="switchMenu(event);"


-1
window.open('page.html', '_newtab');

请指定 '_newtab'。这在IE和FF中有效,并且应该在Chrome中有效。但是,如果用户配置为不在新标签页中打开,则无法做太多事情。


10
在Chrome中,_newtab不起作用。 - user1441141
3
我检查了Chrome的设置,除非我眼瞎,否则我找不到任何控制链接如何打开的选项。 - user1441141

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接