docへの書き込みを実行する。非同期にロードされた外部スクリプトから、明示的にドキュメントを開かないと書き込めない。
質問
ページロードが実行された後に、あるスクリプトをロードしようとしているのですが、以下のような感じです。
function downloadJSAtOnload(){
var element = document.createElement("script");
element.src = "scriptSrc";
document.body.appendChild(element);
}
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
そして、このスクリプトは実行され、'scriptSrc'をダウンロードし、bodyタグの最後の直前に追加しているようですが、コンソール(chrome)には以下のメッセージ(エラーではありません)が出力されます。
Document'で'write'の実行に失敗しました。非同期にロードされた外部スクリプトから、明示的にオープンされない限り、ドキュメントに書き込むことはできません。
これは何を意味するのでしょうか。また、私は何か違うことをしなければならないのでしょうか?期待された動作が得られているにもかかわらず?
どのように解決するのですか?
非同期に読み込まれたスクリプトは、ドキュメントが完全に解析され、閉じられた後に実行される可能性が高いです。 したがって
document.write()
を使用することはできません (技術的には可能ですが、あなたが望むことはできないでしょう)。
を置き換える必要があります。
document.write()
ステートメントを、DOM 要素を作成して特定の親要素に挿入することで、明示的な DOM 操作に置き換える必要があります。
.appendChild()
または
.insertBefore()
または設定
.innerHTML
のような直接の DOM 操作のための何らかのメカニズムが必要です。
例えば、インラインスクリプトでこのようなコードを書くのではなく
<div id="container">
<script>
document.write('<span style="color:red;">Hello</span>');
</script>
</div>
これを利用して、上記のインラインスクリプトを動的に読み込むスクリプトに置き換えることになります。
var container = document.getElementById("container");
var content = document.createElement("span");
content.style.color = "red";
content.innerHTML = "Hello";
container.appendChild(content);
あるいは、コンテナの中に、ただ単に追加する必要のある他のコンテンツがなければ、単にこうすることもできます。
var container = document.getElementById("container");
container.innerHTML = '<span style="color:red;">Hello</span>';
関連
-
[解決済み】スクリプトの読み込みと実行順序について
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] jqueryはjavascriptのライブラリなのかフレームワークなのか?[クローズド]
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] CORS: 認証モードは 'include' です。
-
[解決済み] JavaScript で css プロパティを使用して HTML 要素の背景色を設定する方法
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] jqueryはjavascriptのライブラリなのかフレームワークなのか?[クローズド]
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] イテレータでmap()を使用する
-
[解決済み] javascriptでオプションのパラメータを扱う
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]
-
[解決済み] 変異を伴わないオブジェクトからの値の削除