打开一个新的标签/窗口并写一些内容?

Tei*_*eiv 13 javascript firefox xpcom firefox-addon

我正在使用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');
Run Code Online (Sandbox Code Playgroud)

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

但是我总是得到这个错误

[例外......"手术不安全." 代码:"18"nsresult:"0x80530012(SecurityError)"

有没有办法解决这个异常?

Wla*_*ant 21

编辑:截至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();
Run Code Online (Sandbox Code Playgroud)

供参考:数据URI

  • 这不再起作用,也许 Google Chrome 中发生了一些变化。 (3认同)
  • 使用 [DOM 方法](https://developer.mozilla.org/en-US/docs/DOM/Node.appendChild)? (2认同)

Jam*_*s T 11

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

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

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

但不会阻止

  • 用户明确输入/粘贴"data:…"到地址栏中
  • 打开所有纯文本数据文件
  • 打开"data:image/*"在顶层窗口,除非它是"data:image/svg+xml"
  • 开放"data:application/pdf""data:application/json"
  • 下载数据:URL,例如'save-link-as' "data:…"

您还可以阅读该建议,以弃用并删除Chrome中的数据网址的顶部框架导航,并查看当前的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
Run Code Online (Sandbox Code Playgroud)

请注意,至少在Chrome中,通过document.write注入的外部脚本可能无法在较慢的连接上加载.这可能与此无关,但值得注意.