打开一个新的标签页/窗口并向其中写入内容?

26

我正在使用Execute JS在Firefox中编写和测试JavaScript代码。我想要打开一个新的标签页/窗口并向其中写入一些内容,我尝试过:

var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
var win = wm.getMostRecentWindow("navigator:browser");
printWindow = win.open("about:blank");
printWindow = wm.getMostRecentWindow("navigator:browser");
printWindow.gBrowser.selectedBrowser.contentDocument.write('hello');

myWindow=window.open('','','width=200,height=100')
myWindow.document.write("<p>This is 'myWindow'</p>")
myWindow.focus()

但我总是会遇到这个错误

[异常... "The operation is insecure." code: "18" nsresult: "0x80530012 (SecurityError)"

有没有办法处理这个异常?


“Exception: The operation is insecure”是Firefox默认控制台的一个错误(https://bugzilla.mozilla.org/show_bug.cgi?id=663406),在Firefox和Chromium默认控制台上使用Firebug控制台时不会发生此错误。我在这里发表了评论:https://stackoverflow.com/questions/12898528/loading-an-iframe-from-a-string-variable-in-xulrunner#comment41391652_12911226 - baptx
4个回答

33
Chrome、Firefox(部分情况除外)、IE和Edge(以及可能其他浏览器)已经禁止访问数据URL的顶级导航。它们显然常用于网络钓鱼攻击,主要的浏览器供应商认为危险性超过了合法使用案例提供的价值。
这篇Mozilla安全博客文章解释了Firefox将会阻止以下行为:
  • 网页通过以下方式导航到新的顶级数据URL文档:
    • window.open("data:…");
    • window.location = "data:…"
    • 点击<a href="data:…">(包括ctrl+click,“在新标签页中打开”,等等)。
  • 网页重定向到新的顶级数据URL文档:
    • 302重定向到"data:…"
    • meta refresh到"data:…"
  • 外部应用程序(例如ThunderBird)在浏览器中打开数据URL
但不会阻止:
  • 用户明确将"data:…"输入/粘贴到地址栏中
  • 打开所有纯文本数据文件
  • 在顶级窗口中打开"data:image/*",除非它是"data:image/svg+xml"
  • 打开"data:application/pdf""data:application/json"
  • 下载数据URL,例如“另存为”"data:…"

您还可以阅读建议在Chrome中废弃和删除数据URL的顶部框架导航并查看当前Chrome状态指示已被删除

至于如何在新标签页或窗口中实际打开HTML,这应该就足够了:

var tab = window.open('about:blank', '_blank');
tab.document.write(html); // where 'html' is a variable containing your HTML
tab.document.close(); // to finish loading the page

请注意,在Chrome浏览器中,通过document.write注入的外部脚本可能在较慢的连接上无法加载。这可能与本题不相关,但需要注意。

1
这将在新标签页中打开当前所在的地址。你可能是想使用 window.open("about:blank", "_blank")。此外,浏览器会自动切换到新标签页,调用 .focus() 是没有意义的。 - Wladimir Palant
明白了 - 感谢提供信息!我会继续进行编辑(并将其应用到我的代码中)。同时,感谢您修复我的格式。 - James T
这是对我来说第一个可行的解决方案。我正在Google Chrome上尝试它。 - Mariusz
如果我不使用 tab.document.close(); 会怎样? - DevonDahon

24

编辑:自2018年起,这个解决方案已经不再适用。因此,您需要在新窗口中打开about:blank并向其中添加内容。

不要"写入"到窗口,只需使用所需内容打开它即可:

var data = "<p>This is 'myWindow'</p>";
myWindow = window.open("data:text/html," + encodeURIComponent(data),
                       "_blank", "width=200,height=100");
myWindow.focus();

供参考:数据URI


2
使用DOM方法 - Wladimir Palant
1
@user433531:给窗口一些加载的时间?myWindow.addEventListener("load", ..., false) - Wladimir Palant
我有一大堆数据要写入,但在Windows系统中Firefox却一直挂起(显示“未响应”) :-( - Emery Lapinski
这个解决方案对我没有用(或者至少不符合我的目的)。这难道不是一个downvote的好理由吗? - Emery Lapinski
3
这不再起作用了,也许是谷歌浏览器发生了一些变化。 - Mariusz
显示剩余7条评论

4
var winPrint = window.open('', '', 'left=0,top=0,width=800,height=600,toolbar=0,scrollbars=0,status=0');
winPrint.document.write('<title>Print  Report</title><br /><br /> 
Hellow World');
winPrint.document.close();

从2018年开始,window.open(uri)在Chrome浏览器中无法使用。


一般来说,URI并没有被阻止 - 数据URL被阻止了。显然它们通常用于网络钓鱼攻击。Chrome和Firefox都将其阻止 - 请参阅Mozilla安全博客文章、Chrome的意图废弃和删除帖子以及Chrome状态帖子,指出它已被移除。 - James T
未捕获的语法错误:无效或意外的标记。 - Fernando Torres

0
这是我在尝试使用JavaScript创建自定义窗口时找到的可行代码。
function createPage(){
    let pageCode = "<p>Hello, World!</p>"
    let page = window.open()
    page.document.write(pageCode)
}

`

创建新窗口时,实际上是创建一个新的标签页,而不是一个不同的窗口。

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