【问题标题】:Javascript window.open works in Chrome console but not as a snippetJavascript window.open 在 Chrome 控制台中工作,但不能作为片段
【发布时间】:2017-07-29 03:11:29
【问题描述】:

我对 Javascript 比较陌生,我正在编写一些小脚本来修改我经常使用的网页。我正在自动化的一件事是在选项卡中打开某些链接,因此我不必手动执行此操作。

如果我将此行放入我的 sn-p 并运行它,什么也不会发生:

window.open("http://www.google.com");

但是,如果我在控制台中输入它并按回车键,它会打开一个带有 URL 的新选项卡。所有这些都发生在 Inspector 中。为什么它在一个地方有效,而在另一个地方无效?有解决办法吗?

【问题讨论】:

  • 我在地址栏中看到一条关于被阻止弹出窗口的通知。 AFAIK 这是默认行为,但您可以在浏览器选项中更改它。
  • 你可以参考这篇文章的解释。 stackoverflow.com/questions/11821009/…

标签: javascript google-chrome-devtools


【解决方案1】:

当 Chrome 检测到对 window.open() 的调用并非源自用户手势时,它会将其阻止为弹出窗口。

您可以通过显示在 URL 栏右边缘的小弹出模式手动覆盖它:

您提出的有趣的事情是:为什么它可以在控制台中工作,而不是在片段中?我询问了 DevTools 团队,其中一位非正式地认为 DevTools 将控制台执行视为用户手势,以避免此类安全检查。

一种可能对您来说足够好的解决方法是从新的 Chrome 标签 (chrome://newtab) 运行您的 sn-p。当我从该页面运行代码段时,我可以打开新窗口而不会触发“弹出窗口被阻止”模式。

感谢您试用控制台和代码段的工作方式。事实证明这很有趣。

【讨论】:

  • 感谢您为我调查此事。事实证明,正如您和 wOxxOm 所建议的那样,“允许”从相关站点弹出窗口可以解决问题。一旦弹出窗口被解锁,sn-ps 就可以像我需要的那样打开一个标签。
【解决方案2】:

确实,window.open 有点误导。这是因为window 是 JavaScript 中的全局上下文,open 是该对象中的一个方法。你不应该把它读作“打开一个窗口”。 其实呢

将资源加载到 [...] 新的浏览上下文(例如窗口)

(MDN)

大多数现代浏览器都是选项卡式的,因此 browsing contxt 是一个选项卡,然后,它们(大多数情况下,但并非总是)会打开一个新选项卡而不是一个窗口。你能做什么?比如像这样的代码

window.open('http://google.de', 'google', 'width=500,height=500')

实际上为我打开了一个窗口(Chrome 59)。但是,它可能会被浏览器阻止为弹出窗口。

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 2016-01-20
    • 2019-01-22
    • 2015-11-26
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多