質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

3回答

648閲覧

JavaScript 外部ファイルの実行終了を探知するには

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/08/28 23:20

編集2021/08/28 23:41

JavaScript 外部ファイルの実行終了を探知したいです
下記のやり方でも実行終了探知できますがこれは望んでいません

var script = document.createElement("script");
script.src = "script.js";
script.addEventListener("load", function(){
hello();
});

scriptにaddEventListenerか何かで実行が終了したことを探知
もしくは
for(i=0;i<100;i++){
div.innerHTML+=i+"<br>";
}
alert("実行終了");
のように外部ファイルに動的に差し込むことはできませんでしょうか?
外部ファイルに直書きせず、終了を探知したいです

<script> window.onload=function(){ var div = document.createElement("div"); div.id="div"; document.body.appendChild(div); var script = document.createElement("script"); script.src = "script.js"; script.addEventListener("load", function(){ hello(); }); document.body.appendChild(script); } function src_end(){ alert("実行終了"); } </script>
script.js function hello(){ for(i=0;i<100;i++){ div.innerHTML+=i+"<br>"; } //src_end();と書けば済む話ですがscript.jsには何も記述しないこと前提 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2021/08/28 23:25

対象の<script>は動的に追加する前提ですか? HTMLに最初から書かれていることはないですか?
退会済みユーザー

退会済みユーザー

2021/08/28 23:27

動的追加前提です
退会済みユーザー

退会済みユーザー

2021/08/28 23:30 編集

これを考えたのですが <script> window.onload=function(){ var div = document.createElement("div"); div.id="div"; document.body.appendChild(div); var script = document.createElement("script"); script.src = "script.js"; script.addEventListener("load", function(){ hello(); }); script.addEventListener("DOMContentLoaded", function(){ src_end(); }); document.body.appendChild(script); } function src_end(){ alert("end"); } </script> これが正しく成り立ってるのか、わかりません DOMContentLoadedはscript.jsのスクリプトの実行が完了されてから呼び出されてると考えていいのでしょうか?
ku__ra__ge

2021/08/28 23:31

「外部ファイルの実行終了」とは何かを明確に提示してください。 外部ファイルのロードが終了したときではないというのは質問から分かりますが、では具体的に何が起きたときを検知したいのかが分かりません。
退会済みユーザー

退会済みユーザー

2021/08/28 23:33

function hello(){ for(i=0;i<100;i++){ div.innerHTML+=i+"<br>"; } } が終了した時点でsrc_end()を実行したいのです これを外部ファイルに記述することなく。
ku__ra__ge

2021/08/28 23:36

単純に考えれば呼び出すとき、 hello(); src_end(); ……って書けばいい気がしますが、それじゃ駄目なんですか?
退会済みユーザー

退会済みユーザー

2021/08/28 23:38

hello();の実行が完了したことを明確に探知して実行したいのでそれはダメです
maisumakun

2021/08/28 23:54

「呼び出されるファイルの方に完了を伝える処理を書く」といくのがいちばん確実なのですが、その方法を取れない・取りたくない理由は何なのでしょうか?
退会済みユーザー

退会済みユーザー

2021/08/28 23:55

ファイルの数が多くなってくると全てに記述するのが面倒だからです
maisumakun

2021/08/29 00:26

> ファイルの数が多くなってくると全てに記述するのが面倒だからです ファイルごとにロジックが違えば、終了を検知する処理もそれぞれに違いえます。 「終了時にする処理を分離したファイルの側から呼び出す」という形で共通化するほうが、ファイルごとに「終了を検知する処理」を考える必要をなくなるので書きやすいのではないかと考えます。
guest

回答3

0

動的インポートはいかがでしょうか。

html

1 <script type="module"> 2 import('./script.js') 3 .then(() => { 4 alert('end') 5 }); 6 </script>

js

1// script.js 2const sleep = time => new Promise(resolve => setTimeout(resolve, time)); 3 4for (let i = 0; i < 100; i++) { 5 document.body.innerHTML += i + "<br>"; 6 await sleep(100); 7}

もし、モジュールが非同期処理をしてる場合は上手くいかないと思います。

投稿2021/10/12 06:47

Lhankor_Mhy

総合スコア36896

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あらゆるケースに使える一般的な方法はないと思います。

外部スクリプトの最後にコードを動的に差し込むのは可能だと思いますが、例に挙げられているように外部スクリプトで定義された関数の終了時に実行されるようにコードを差し込むのはほぼムリです。

js

1// ここに本来のコード 2 3src_end(); // ここに差し込むのは可能

js

1function hello() { 2 // ここに本来のコード 3 4 src_end(); 5 // 関数の終了時点のために差し込むのはほぼムリ。 6 // 途中で return しているかもしれないし、この関数は 7 // このファイル内の他の関数から呼ばれているかもしれない。 8 // 非同期な処理をどうするかも考慮する必要あり。 9}

「なぜ終了を検知したいのか」がわかれば、yambejpさんの回答のように別の手段があるかもしれません。

投稿2021/08/30 02:17

編集2021/08/30 02:23
int32_t

総合スコア21599

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

MutationObserverで処理してみては?

javascript

1window.addEventListener('DOMContentLoaded', ()=>{ 2 var mo = new MutationObserver(function(r){ 3 r.forEach(x=>{ 4 x.addedNodes.forEach(y=>{ 5 if(y.nodeName=="SCRIPT"){ 6 y.addEventListener('load',()=>{ 7 console.log(y.nodeName); 8 }); 9 } 10 }); 11 }); 12 }); 13 const opt = { 14 childList: true, 15 }; 16 mo.observe(document.body, opt); 17 var script = document.createElement("script"); 18 script.src = "sample1.js"; 19 document.body.appendChild(script); 20 var script = document.createElement("script"); 21 script.src = "sample2.js"; 22 document.body.appendChild(script); 23});

投稿2021/08/30 01:37

yambejp

総合スコア116443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問