23

我正在使用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()

但是我总是收到这个错误

[例外……“操作不安全。” 代码:“18” nsresult:“0x80530012(安全错误)”

有什么办法可以通过这个异常?

4

3 回答 3

26

在 Chrome、Firefox(有一些例外)、IE 和 Edge(以及可能启动的其他浏览器)中,对数据 URL 的顶级导航已被阻止。它们显然通常用于网络钓鱼攻击,主要浏览器供应商认为危险超过了合法用例提供的价值。

这篇Mozilla 安全博客文章解释说 Firefox 将阻止

  • 使用以下命令导航到新的顶级数据 URL 文档的网页:
    • window.open("data:…");
    • window.location = "data:…"
    • 点击<a href="data:…">(包括 ctrl+click、'open-link-in-*' 等)。
  • 使用以下命令重定向到新的顶级数据 URL 文档的网页:
    • 302重定向到"data:…"
    • 元刷新到"data:…"
  • 在浏览器中打开数据 URL 的外部应用程序(例如 ThunderBird)

但不会阻塞

  • 用户明确输入/粘贴"data:…"到地址栏
  • 打开所有纯文本数据文件
  • "data:image/*"在顶级窗口中打开,除非它是"data:image/svg+xml"
  • 开幕式"data:application/pdf""data:application/json"
  • 下载数据:URL,例如 'save-link-as'"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 注入的外部脚本可能不会在较慢的连接上加载。这可能与这里无关,但需要注意。

于 2018-02-27T23:19:12.347 回答
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

于 2012-08-15T10:20:09.347 回答
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 中不起作用

于 2018-02-27T18:51:43.220 回答