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

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

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

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

Q&A

4回答

1027閲覧

JavaScriptファイルが「読まれなかった」時点で検知する方法

nikuatsu

総合スコア177

JavaScript

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

0グッド

1クリップ

投稿2023/05/10 15:34

JavaScriptでコードにエラーがあるときそのファイルが読まれませんが、「読まれなかった」時点で検知するにはどうしたらいいのでしょうか?

実行内容とエラー

ブラウザでこう実行すると

JavaScript

1hoge('apple');

こちらの defined のエラーになりました。

JavaScript

1caught ReferenceError: hoge is not defined

試したこと

開発ツールでHTMLを見てもきちんとこう書かれておりました。

html

1 <script src="https://example.com/hoge.js"></script> 2</body>

さらにブラウザのURLバーにhttps://example.com/hoge.jsを入力すると、問題なくこれが表示されました。

JavaScript

1function hoge(fruits){ 2 const fruits = 'lemon'; 3 console.log('hoge!'); 4}

生じた疑問

「え?ファイルが存在していて、読めているのに、じゃなんで defined のエラーなのか?」と、ハマってしまったのです。

原因

その原因が今になって「どうやら hoge() 内で引数名と同名を const していたせいで「読まれなかったのか…」と分かったわけです。

質問

そもそもコンソールで「読まれなかった」という警告などを表示してくれればいいのになぁ。と悔しい思いです。

改めまして、以上のような経緯で「読まれなかった」時点で検知するにはどうしたらいいのでしょうか?

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

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

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

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

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

otn

2023/05/10 16:07

> JavaScriptでコードにエラーがあるときそのファイルが読まれませんが、 とは、何のことを言ってますか? <script href="https://example.com/hoge.js"></script> のようにファイルを読むHTMLタグにエラーがあってファイルが読まれないことを言っているわけじゃ無さそうです。 しかし、質問のコードのように、 <script src="https://example.com/hoge.js"></script> と正しく書いてあれば、ファイルが存在する限り、必ず読まれます。 hoge.js の中味にエラーがある場合は、hoge.jsのファイルを読んだ後でエラーが検知されます。その結果、開発者ツールのコンソールタブにエラーメッセージが表示されます。
m.ts10806

2023/05/10 19:13 編集

> hoge('apple'); 上記をどこに書いてるんでしょうか。 そもそもその定義だとfruits が重複してエラーになります。 SyntaxError: Identifier 'fruits' has already been declared
dameo

2023/05/11 08:58

通常.jsは読み込み時に文法エラーがあれば、そこで読み込みは中止になり、エラー内容がブラウザのコンソールに出力され、通常後からでも表示できると思います(正確なブラウザの種類・バージョン次第ですが)。 それが出力されていない以上、今の質問内容のままでは質問自体に疑いの目を向けるしかありません。 こんな想定をすること自体がナンセンスですが(質問者がその可能性をチェックし、除外できないといけない)、今回のケースは恐らく古いキャッシュに残ったhoge.jsが読み込まれ、そこにはhoge()がなかったのではないかと推測します。.jsなどの静的ファイルはブラウザキャッシュなどに残りやすく、長期間変更されていないとサーバー側で変更してもサーバー設定などによっては更新チェックすらされずにキャッシュを使う場合があります。 https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control いずれにしても、再現性その他ご自身でよくよく検証された方がいいかと思います。
退会済みユーザー

退会済みユーザー

2023/05/12 00:45

質問者さん、無言ですが、いくつか回答が出ているのでそれらに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。解決したなら解決に役立った回答にベストアンサーをつけてクローズしてください。とにかく無言は NG です。
guest

回答4

0

コードを見ると、bodyの最後に<script src="https://example.com/hoge.js"></script>を書いているようですが、
これより前に実行されるように書いたコードはhoge.jsを読む前に実行されます。
おそらく、

HTML

1~~~~ 2<script>hoge('apple');</sdript> 3~~~~ 4<script src="https://example.com/hoge.js"></script>

のように書いたのでしょう。仮にhoge.jsの中にエラーが無くても、hoge('apple');の実行時点ではhogeは未定義なので、未定義エラーメッセージが出ます。その後にhoge.jsが読まれてfruits重複のエラーメッセージが出ます。
1つめのエラーメッセージに気を取られて2つめのエラーメッセージを見落としたのでしょう。

質問のコメントに書いたとおり、

JavaScriptでコードにエラーがあるときそのファイルが読まれませんが、

というのは勘違い、ないし、文章の書き間違いだと思いますが、

「読まれなかった」時点で検知するにはどうしたらいいのでしょうか?

についても意味の無いことを言っています。
この文脈において「読まれなかった時点」という概念は実在しません。

何らかの身体症状が出て医者に行ったとして、「症状が出た時点で、この薬を飲んでください」と言われたらやるべき事は明確ですが、「症状が出なかった時点で、この薬を飲んでください」だと、いつ薬を飲めば良いのか?
「お風呂に入って症状が出なかったら」とか、「寝る前の時点でそれまでに症状が出なかったら」のように判断する時点の指定が必要です。

文章の書き間違いで、

エラーが発生した時点で検知するにはどうしたらいいのでしょうか?

であれば、目で見るので良いのであれば、開発者ツールのコンソールですが、これは見てますよね?
エラートリガーで何かしたい場合はtry catchとかありますが、文法エラーならtry自体が認識されない気がします。

関数未定義の解決策としては、
・先に実行して欲しいコードは先に書く
・先に実行して欲しいコードを後ろに書かざるを得ない場合は、先に実行されるように工夫する
など。
また、「このHTML要素が表示されてから実行したいコード」とかあれば、イベントを使う。

投稿2023/05/11 01:33

編集2023/05/11 02:51
otn

総合スコア84555

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

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

0

状況がわかりませんがとりあえずtry-catchしてみるとかですかね

javascript

1<script> 2try{ 3 hoge('apple'); 4}catch(e){ 5 console.error(e); 6} 7try{ 8 if(typeof hoge=="undefined"){ 9 throw new Error("my error!"); 10 } 11 hoge('apple'); 12}catch(e){ 13 console.error(e); 14} 15</script> 16<script src="https://example.com/hoge.js"></script> 17<script> 18try{ 19 hoge('apple'); 20}catch(e){ 21 console.error(e); 22} 23</script>

投稿2023/05/11 00:13

編集2023/05/11 01:14
yambejp

総合スコア114843

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

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

0

え?ファイルが存在していて、読めているのに、

問題の js ファイルは読んだけど、m.ts10806 さんが質問のコメント欄で書かれたように SyntaxError: Identifier 'fruits' has already been declared というエラーで無効 (hoge は未定義) 。

じゃなんで defined のエラーなのか?

質問に書いてないので想像ですが、質問に書いてない別のスクリプトで hoge を使ったからでしょう。


【追記】

「読まれなかった」時点で検知するにはどうしたらいいのでしょうか?

上に書いたように読まれなかったわけではないようなので、「読まれなかった」ことは検知できないはずです。

なので取りうる手段は、int32_t さんが書かれたように、「フロントエンド開発中にはブラウザの開発者ツールのコンソール」を見て、とにかくまず js ファイルのエラーに気づいてそれを直すようにすることだと思います。

そのうえで、js ファイルに含まれる特定のオブジェクトを調べて、未定義かどうか調べるという話になると思います。

例えば、CDN から提供される js ファイルが読めなかった場合(CDN サイトがダウンしてたとかで)、以下の記事の「(2) Script Tag Helper の場合」のように、js ファイルに含まれる特定のオブジェクトを調べて、それが無かったらフォールバック(代替え)js ファイルをダウンロードさせると言ったこともできます。

Link Tag Helper と Script Tag Helper (CORE)
http://surferonwww.info/BlogEngine/post/2021/08/09/link-tag-helper-and-script-tag-helper-for-aspnet-core.aspx

投稿2023/05/11 00:00

編集2023/05/11 00:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

「読まれなかった」わけではなくて、関数 hoge() を実行した結果エラーが出たわけです。

基本的には、フロントエンド開発中にはブラウザの開発者ツールのコンソールを開きっぱなしにしておきましょう。エラーが表示されます。
それでも見逃してしまうなら、error イベントで目立つように表示すればよいでしょう。

js

1window.addEventListener('error', error => { 2 alert(`${error.type}: ${error.message}`); 3});

投稿2023/05/10 23:18

int32_t

総合スコア20884

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問