【问题标题】:Google Chrome "window.open" workaround?谷歌浏览器“window.open”解决方法?
【发布时间】:2011-02-04 01:35:06
【问题描述】:

我一直在开发一个网络应用程序,其中一部分我需要打开一个新窗口。我在所有浏览器上都可以使用,我的症结在于 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;
}

【问题讨论】:

  • 哇——这很奇怪。我想是某种被误导的“安全”功能。
  • 是的,这很奇怪,花了一些功夫才走到这一步!大声笑
  • 这可能不是您想听到的,但不要在新窗口/标签中打开内容。如果用户想要一个新窗口,他们可以要求他们的浏览器这样做。
  • 感谢 jamesdlin,它实际上是一个用于测试浏览器大小的 Web 开发工具,所以它有点重要:)

标签: javascript google-chrome


【解决方案1】:

其他答案已过时。 window.open 的 Chrome 的行为取决于调用它的位置。另见this topic

当从通过用户操作(例如 onclick 事件)触发的处理程序调用 window.open 时,它的行为类似于 <a target="_blank">,默认情况下会在新选项卡中打开。但是,如果在其他地方调用 window.open,Chrome 会忽略其他参数并始终打开一个带有不可编辑地址栏的新窗口。

这看起来像是某种安全措施,尽管其背后的原理并不完全清楚。

【讨论】:

  • 你知道有没有这方面的官方文档吗?
【解决方案2】:

这对我有用:

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

【讨论】:

  • 这取决于从哪里调用它,请参阅下面的答案。
  • 不适用于我的命名窗口(它打开一个新窗口而不是现有窗口),无论从@jeroen 调用它的位置
【解决方案3】:

location=1 部分应启用可编辑的位置栏。

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

更新

statusbar=1 设置为正确的参数status=1 对我有用

【讨论】:

  • 感谢 sunliffe 的回复 :) 我刚刚尝试了这些设置,位置栏显示了 URL,但仍然无法编辑 :(
  • 谢谢 - 我错过了参数的 status=1 部分,这阻止了 chrome 将其视为功能齐全的 window.open()。当我把它放进去时,它开始在标签中打开窗口。
【解决方案4】:

menubar 必须为 no 或 0,Google Chrome 才能在新窗口而不是标签页中打开。

【讨论】:

  • 此解决方案适用于 Google Chrome 29/Opera 20,尽管在这两种浏览器中定位窗口(使用“left=XX&top=YY”)无法按预期工作。 (假设是这两个浏览器的错误)
【解决方案5】:

我相信目前没有 javascript 方法可以强制 chrome 在选项卡模式下作为新窗口打开。已在此处提交票证Pop-ups to show as tab by default。但是用户可以点击左上角的 chrome 图标并选择“显示为标签”,地址栏就可以编辑了。

javascript open in a new window not tab 中提出了类似的问题。

【讨论】:

  • 如果你在打开一个窗口时没有指定和窗口属性,它应该把它放在一个选项卡中。相反,如果您希望打开一个窗口而不是一个选项卡,请至少指定一个窗口属性。
  • OP 的问题不在于作为新窗口或标签打开。在chrome中,OP正在打开一个新窗口,但位置栏是灰色的。地址栏只有在新窗口为“显示为标签”时才可编辑。
  • 感谢 Dingle 的输入,我或许能以某种方式解决这个问题 ;)
  • @McBonio,请用您的解决方法更新帖子,谢谢。
【解决方案6】:

据我所知,如果您引用 localhost(例如,您正在本地开发站点),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);
}

【讨论】:

    【解决方案7】:

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

    如果你这样做,你只能打开一次。使用 _blank 等代替。

    【讨论】:

      【解决方案8】:

      为什么在 2021 年情况仍然如此复杂? 对我来说,我想在新的 chrome 窗口中全屏打开,所以我使用了以下内容:

      window.open("http://my.url.com", "", "fullscreen=yes");
      

      这可以正常打开一个新的 chrome 窗口。如果没有最后的选项,它只会打开一个新标签

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

        • @cezar 这不是一个新问题。请注意“我找到了这个解决方案”的部分。
        • 这会创建一个无限循环。此外,它会打开一个新选项卡,而不是一个新窗口。
        • 对不起。我对两个函数(SetInterval 和 SetTimeout)感到困惑,这是适用于两者的解决方案,但 SetInterval 它实际上是无限循环。作为使用 SetInterval 函数的结果解决方案,这是错误的方法,请尝试使用 SetTimeout 函数来使用此解决方法
        猜你喜欢
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        相关资源
        最近更新 更多