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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

2回答

1985閲覧

jQueryで$.getScriptを使って読み込んだJSファイルの関数を使いたい。

NK0920

総合スコア4

JavaScript

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

1クリップ

投稿2021/10/28 15:25

前提・実現したいこと

今ローディング画面を作っているのですが、非同期通信で読み込んだJavaScriptファイルの関数を使おうとしています。

発生している問題・エラーメッセージ

Uncaught ReferenceError: func is not defined

該当のソースコード

jQueryの宣言は省略しています。
load.js

javascript

1var urlArray = [ 2 "〜", 3 "〜", 4 "〜", 5 "〜", 6 "〜", 7 "〜", 8 "〜", 9 "〜", 10 "/source/script.js", 11 "〜", 12 "〜", 13 "〜" 14 ] 15 const jsFileCount = 11;//使うJSファイルの量 16 var jsFile = 0 17 var savedFileCount = 0 18 var loadedBoolean = true 19 var countPercent; 20 var savedPercent = 0 21 var valiable = false 22 var startCount = setInterval(function () { 23 savedPercent = countPercent 24 if (loadedBoolean == true) { 25 loadedBoolean = false 26 $.getScript( 27 urlArray[jsFile] 28 ).done(function (script, textStatus) { 29 loadedBoolean = true 30 savedFileCount++ 31 jsFile++ 32 }).fail(function (jqxhr, settings, exception) { 33 console.log("外部ファイルの読み込みに失敗しました。") 34 }) 35 } 36 countPercent = Math.floor(savedFileCount / jsFileCount * 100) 37 console.log(countPercent + "%") 38 $("#splash_text").text(countPercent + "%") 39 $("#splash_bar").animate({ 40 width: countPercent + "%" 41 }, 100) 42 43 //もし終わったら終了 44 if (savedFileCount == jsFileCount) { 45 clearInterval(startCount) 46 func() 47 } 48 }, 100)

script.js

javascript

1function func (){ 2 alert("正常に読み込まれました。") 3}

試したこと

script.jsにはテスト用にfuncの関数がありますが、本当は他のコードが入っています。
しかし、上記のエラーコードが出ていたのでもしかして読み込まれていないのでは...と思い、
script.jsに

javascript

1alert("正常に読み込まれました。")

をそのまま書くと、しっかりと表示されました。
よってscript.jsは読み込まれていたはずなのですが、関数を使おうとするとエラーが出てしまう問題が発生しています。

補足情報(FW/ツールのバージョンなど)

Google Chrome
jQuery 3.2.1

何か不明な点がございましたらコメントにて教えていただけると嬉しいです。

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

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

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

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

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

guest

回答2

0

js

1$.getScript( 2 urlArray[jsFile] 3).done(function (script, textStatus) { 4 loadedBoolean = true 5 savedFileCount++ 6 jsFile++ 7})

上記部分ですが、jsFile=0、つまりurlArray[0]のスクリプト読み込み終了時に、savedFileCount1になります。
ということは、urlArray[10]のスクリプト読み込み終了時に、savedFileCount11になって、savedFileCount == jsFileCountが成立すると思いますが、これは想定と異なるのではないですか?


コメントを受けて追記

わかりにくいようなので補足します。

urlArray[10]のスクリプト読み込み終了時に、savedFileCountは11になって、savedFileCount == jsFileCountが成立する

と書きましたが、これは「if文が実行されていない」という意味ではないです。
「savedFileCount == jsFileCountが成立する」ということですから、逆に「if文が実行されてしまう」という意味です。
「if文が実行される」ということはどういうことかというと、func()が実行される、ということです。
つまり、「urlArray[10]のスクリプト読み込み終了時に、func()が実行されているのではないですか?」というのが、当方の回答です。


蛇足ですが

$.getScript()の戻り値はthenableですので、awaitが使えます。

js

1for (let i = 0; i < urlArray.length; i++) { 2 await $.getScript( 3 urlArray[i] 4 ) 5 const countPercent = Math.floor((i + 1) / urlArray.length * 100) 6 console.log(countPercent + "%",) 7 $("#splash_text").text(countPercent + "%") 8 $("#splash_bar").animate({ 9 width: countPercent + "%" 10 }, 100) 11} 12func()

コメントを受けて再々追記

あー、なんか納得されないようなので、仕方がないな。
スマートじゃないですが、では、もう、いっそ、こうしたらどうですか?

js

1 ).done(function (script, textStatus) { 2 //もし終わったら終了 をここに移動 3 if (savedFileCount == jsFileCount) { 4 clearInterval(startCount) 5 func() 6 } 7 loadedBoolean = true

別に回答者の言うことは絶対だ、とか言わないですが、示された回答にバグの原因が書いてあるんですから、せめて変数のウォッチとかステップ実行ぐらいしても罰は当たんないと思いますけどね。
正直こりごりですので、これ以降は応答不要です。

投稿2021/10/29 01:44

編集2021/10/29 09:55
Lhankor_Mhy

総合スコア36074

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

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

NK0920

2021/10/29 01:54

申し訳ありません。情報が抜けておりました。 if (savedFileCount == jsFileCount) { clearInterval(startCount) console.log("終了") } のように追記すると、しっかりとコンソールには終了と表示されるので、if文が実行されていないと言うことはないと思います。 しかし、そのif文の中で読み込んだJSファイルの関数を使おうとするとエラーが出てしまいます。 この点を踏まえてご回答していただければ幸いです。
Lhankor_Mhy

2021/10/29 01:58

「if文が実行されていない」と回答したつもりはないです。 私の回答をどのようにお読みになりましたでしょうか?
NK0920

2021/10/29 03:01

回答の読み取りを誤ってしまい、申し訳ありません。 回答の補足を読み、if文の条件を urlArray[jsFile] == urlArray[urlArray.length - 1 とすれば良いと思い、変更したところ、やはりエラーが出てしまいました。 ご回答よろしくお願いいたします。
Lhankor_Mhy

2021/10/29 03:27

-1 がいらないと思います。 urlArray[jsFile] == urlArray[urlArray.length] でいいのでは。(urlArrayもいらないとは思いますが)
NK0920

2021/10/29 09:04

urlArray[jsFile] == urlArray[urlArray.length] とすると、 Uncaught SyntaxError: Unexpected token '<' at p (jquery.min.js:2) というエラーが出ました。 jqueryファイルのエラーで、Unexpectedが「<」(おそらく<!DOCTYPE html>と思われる)なので、私的には「存在しないファイルを読み込んだ」というエラーだと考えます。 また、おそらくurlArray.lengthは0からカウントではなく、1からカウントだと思うので、-1は必要だと考えた次第です。 また、この質問の意図としては、非同期通信で読み込んんだJSファイルの関数を呼び起こそうとしたらエラーが出るという質問です。また、setTimeoutで全てのファイルを完全に読み込んだ後にfunc()を使っても「定義されていない」とエラーが出てしまいました。 図々しくて申し訳ありませんが、もう少し私のためにご再考いただければ嬉しいです。
Lhankor_Mhy

2021/10/29 09:07

Uncaught SyntaxError: Unexpected token '<' が出ることは、当方でも確認しています。 本質問の目的は、 func is not defined のエラーを解消し、func関数の実行をする、というものだったと思うのですが、認識は一致していますでしょうか。 認識に齟齬がないのであれば、そのエラーについてはまた別の問題であると思うのですが、いかがですか。
NK0920

2021/10/29 09:16

早急なご返事、ありがとうございます。 本質問の目的としては合致しております。 しかし、もうすでに読み込んであるスクリプトファイルの関数が実行できないという問題だと認識しております。 ただし、検証ツールで確認したところ、クロスドメイン以外(自分のサーバー内のみ)のJSファイルは読み込んでいないと表示してありました。しかし、そのファイルにalert文をつけると、実行されます。 よって何らかの不具合がそこにあると考えています。検証ツールには表示されないが、しっかりと平文(?)は実行されるということです。 よろしくお願いいたします
Lhankor_Mhy

2021/10/29 09:24 編集

繰り返しになりますが、「urlArray[10]のスクリプト読み込み終了時、つまりurlArray[11]のスクリプト読み込み前に、func()が実行されているのではないですか?」というのが当方の回答であり、回答のように修正したコードで当方の環境での動作を確認しています。 上記の通りの原因であれば、「しっかりと平文(?)は実行される」という現象や「Unexpected token '<'」のエラーについても整合性があります。 NK0920 さんの環境で修正したコードが動作しないのであれば、ご提示いただいていない部分に原因があると思われます。
Lhankor_Mhy

2021/10/29 09:38

なお、この場合の「当方の環境での動作を確認」とは、アラートの表示であって、「Unexpected token '<'」のエラーについては関知していません。
NK0920

2021/10/29 09:51

理解が遅れていまして、申し訳ありません。 上記のご回答を読んでも、いまいち改善策が思いつきません。 差し支えなければ改善案の一つをご教示いただけないでしょうか。 よろしくお願いいたします。
Lhankor_Mhy

2021/10/29 10:00

行き違いになったようですが、回答に追記しました。 他の回答者をお待ちいただきたいと思います。
guest

0

自己解決

遅くなりましたが、諦めました。

投稿2021/12/24 06:56

NK0920

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問