谷歌浏览器“window.open”解决方法?

65

我一直在开发一个Web应用程序,其中一部分需要打开一个新窗口。我已经在所有浏览器上实现了这个功能,但在Google Chrome中遇到了问题。

Chrome似乎忽略了窗口特性,这导致了我的问题。我遇到的难题是我需要在新窗口中可以编辑地址栏。FF、IE、Safari和Opera都可以做到这一点,但Chrome不行。

我的代码:

function popitup(url) {
  newwindow=window.open(url, 'name', 'toolbar=1,scrollbars=1,location=1,statusbar=0,menubar=1,resizable=1,width=800,height=600');
  if (window.focus) {
    newwindow.focus()
  }
  return false;
}

1
哇 - 这很奇怪。我想这是某种误导性的“安全”功能。 - Ray
是的,这个有点奇怪,花了一些时间才做到这一步!哈哈 - Paul
3
也许这不是你想听到的,但是不要在新窗口/标签页中打开内容。如果用户想要一个新窗口,他们可以请求浏览器执行该操作。 - jamesdlin
12
谢谢jamesdlin,它实际上是一个用于测试浏览器大小的Web开发工具,所以它相当重要 :) - Paul
请查看以下问题:https://dev59.com/N1TTa4cB1Zd3GeqPrFDH - Mahmoud Farahat
该行为还取决于您从哪里调用popitup函数,这可能会导致混淆。请参见下面的答案。 - Jeroen Ooms
9个回答

38
另外的答案已经过时。在Chrome中,window.open的行为取决于它从哪里被调用。有关详细信息,请参见此主题
当通过用户操作(例如onclick事件)触发处理程序时调用window.open,它的行为类似于<a target="_blank">,默认情况下会在新标签页中打开。但是,如果window.open在其他位置调用,则Chrome忽略其他参数,并始终打开具有不可编辑地址栏的新窗口。
这看起来像某种安全措施,尽管其背后的理由并不完全清楚。

9
你知道是否有关于这个的官方文档吗? - Carlos Aguayo

26

这个对我有效:

newwindow = window.open(url, "_blank", "resizable=yes, scrollbars=yes, titlebar=yes, width=800, height=900, top=10, left=10");

1
它取决于从哪里调用它,请参见我下面的答案。 - Jeroen Ooms
无论在哪里调用,对我来说使用带名称的窗口不起作用(它会打开一个新窗口而不是现有的窗口)@jeroen - charley

9

location=1参数应该可以启用可编辑的地址栏。

顺带一提,您可以从脚本中删除language="javascript"属性,因为它现在已被弃用。

更新:

statusbar=1设置为正确的参数status=1对我起作用。


谢谢你的回复,scunliffe :)我刚试了一下这些设置,地址栏会显示URL,但仍然无法编辑 :( - Paul
1
谢谢 - 我错过了参数中的status=1部分,这阻止了Chrome将其视为完整功能的window.open()。当我加入它时,它开始在选项卡中打开窗口。 - Tom Lianza

5

如果在打开窗口时没有指定窗口属性,它应该会将其放置在选项卡中。相反,如果您想要一个窗口而不是选项卡来打开,至少需要指定一个窗口属性。 - nickytonline
1
OP的问题不是关于打开新窗口或标签页。在Chrome中,OP正在打开一个新窗口,但地址栏是灰色的。只有当新窗口被“显示为标签页”时,地址栏才可编辑。 - Dingle
谢谢你的建议,Dingle。我或许可以想办法解决这个问题 ;) - Paul
@McBonio,请更新帖子并分享你的解决方法,谢谢。 - Dingle

5
菜单栏必须为no或0,这样Google Chrome才会在新窗口而不是标签页中打开。

这个解决方案适用于Google Chrome 29 / Opera 20,尽管在这两个浏览器中定位窗口(使用“left = XX&top = YY”)的效果不如预期。(假设这是这两个浏览器中的一个错误) - Algy Taylor

3
据我所知,如果您引用本地主机(比如在本地开发站点),Chrome 浏览器可能无法正常工作。
以下是解决方法:

以下方法可行:

var windowObjectReference;
var strWindowFeatures = "menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes";

function openRequestedPopup() {
  windowObjectReference = window.open("http://www.cnn.com/", "CNN_WindowName", strWindowFeatures);
}

这并不起作用。

var windowObjectReference;
var strWindowFeatures = "menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes";

function openRequestedPopup() {
  windowObjectReference = window.open("http://localhost/webappFolder/MapViewer.do", "CNN_WindowName", strWindowFeatures);
}

此方法在从http://localhost/webappFolder/Landing.do加载时同样不适用。
var windowObjectReference;
var strWindowFeatures = "menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes";

function openRequestedPopup() {
  windowObjectReference = window.open("/webappFolder/MapViewer.do", "CNN_WindowName", strWindowFeatures);
}

2

当您使用window.open("","NAME",....)时,请不要为目标窗口命名。

如果这样做,您只能打开一次。请改用_blank等。


0
为什么在2021年这仍然如此复杂? 对我而言,我想要在新的Chrome窗口全屏打开,所以我使用了以下代码:
window.open("http://my.url.com", "", "fullscreen=yes");

这个代码按预期工作,打开了一个新的Chrome窗口。如果不加上最后的选项,它只会打开一个新标签页。


-3

我有同样的问题,Chrome无法从代码(而不是处理程序)打开新窗口。
我找到了这个解决方案:

setTimeout(function () {
    window.open(
        url, 'name', 'toolbar=1, scrollbars=1, location=1,
        statusbar=0, menubar=1, resizable=1, width=800, height=600'
    );
}, 1);

2
@cezar 这不是一个新问题。请注意其中的“我找到了这个解决方案”部分。 - showdev
这会创建一个无限循环。此外,它会打开一个新的标签页而不是一个新窗口。 - raksheetbhat
抱歉。我对两个函数(SetInterval 和 SetTimeout)感到困惑,这是适用于两者的解决方案,但 SetInterval 实际上是一个无限循环。因此,使用 SetInterval 函数的解决方案是错误的方式,尝试使用 SetTimeout 函数以使用此解决办法。 - barsmaga

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