web-dev-qa-db-ja.com

新しいタブ/ウィンドウを開いて、何かを書き込みますか?

私は 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(SecurityError)"

この例外を回避する方法はありますか?

13
Teiv

編集: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

22
Wladimir Palant

データURLへのトップレベルのナビゲーションは、Chrome、Firefox(一部の例外はあります)、IE、およびEdge(および他のブラウザーが起動する可能性が高い)でブロックされています。それらは明らかにフィッシング攻撃に一般的に使用されており、主要なブラウザーベンダーは、危険性が正当な使用例によって提供される価値を上回ると判断しました。

これ Mozillaセキュリティブログの投稿 は、Firefoxがブロックすることを説明しています

  • 次を使用して新しいトップレベルデータURLドキュメントに移動するWebページ:
    • window.open("data:…");
    • window.location = "data:…"
    • <a href="data:…">をクリック(ctrl + click、 ‘open-link-in- *’などを含む)。
  • 新しいトップレベルのデータURLドキュメントにリダイレクトするWebページ:
    • 302は"data:…"にリダイレクトします
    • "data:…"へのメタ更新
  • ブラウザでデータURLを開く外部アプリケーション(Thunderbirdなど)

しかし、ブロックしません

  • ユーザーがアドレスバーに"data:…"を明示的に入力/貼り付け
  • すべてのプレーンテキストデータファイルを開く
  • "data:image/*"でない限り、トップレベルウィンドウで"data:image/svg+xml"を開く
  • "data:application/pdf""data:application/json"を開いています
  • データのダウンロード:URL、例: "data:…"の「save-link-as」

ChromeのデータURLへのトップフレームナビゲーションを廃止および削除する提案 を読み、 current 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を介して挿入された外部スクリプトは、低速の接続では読み込まれない可能性があります 。ここでは関係ないかもしれませんが、注意する必要があります。

13
James T
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で機能しません

3
Diwakar Raja