打开一个新选项卡/窗口并向其写入内容?

IT技术 javascript firefox firefox-addon xpcom
2021-03-05 01:51:51

我正在使用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(安全错误)”

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

3个回答

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

这篇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 注入的外部脚本可能无法在较慢的连接上加载这可能与此处无关,但需要注意一些事项。

这对我来说是第一个可行的解决方案。我正在 Google Chrome 上试用
2021-04-22 01:51:51
陷阱 - 感谢您提供的信息!我将继续进行编辑(并将其应用到我自己的代码中)。也感谢您修复我的格式。
2021-04-28 01:51:51
这将在新选项卡中打开您当前所在的地址。你可能的意思是window.open("about:blank", "_blank"). 另外,浏览器会自动切换到新标签页,调用.focus()毫无意义。
2021-05-11 01:51:51

编辑:截至 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

@user433531:给窗口一个加载的机会? myWindow.addEventListener("load", ..., false)
2021-04-18 01:51:51
所以我像你告诉我的那样尝试这个代码pastebin.com/n1znvdYk但似乎新元素根本没有附加到文档中。你能帮我解决这个问题吗?
2021-04-28 01:51:51
使用DOM 方法
2021-05-03 01:51:51
非常感谢代码运行良好,但我想知道如何将新数据附加到这个新打开的窗口?
2021-05-05 01:51:51
这不再起作用,也许 Google Chrome 中的某些内容发生了变化。
2021-05-13 01:51:51
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();

window.open(uri) 自 2018 年起在 chrome 中不起作用

URI 通常不会被阻止——数据 URL 会被阻止。显然,它们通常用于网络钓鱼攻击。Chrome 和 Firefox 都阻止了它 - 请参阅Mozilla 安全博客帖子Chrome 打算弃用和删除帖子,以及指示它已被删除Chrome 状态帖子
2021-04-19 01:51:51
未捕获的语法错误:无效或意外的令牌
2021-04-25 01:51:51