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

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

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

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

Q&A

解決済

2回答

6457閲覧

javascriptが実行される順序について

suiheisan

総合スコア35

JavaScript

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

0グッド

0クリップ

投稿2016/12/04 06:13

こちらのサイトを参考にしてぐるぐる回るローディング画像を表示したいのですがうまくいきません。

http://jquery.nj-clucker.com/now-loading/

これはうまくいきます

javascript

1dispLoading("処理中..."); //ローディング画像を表示するユーザー定義関数 2 3//ajax処理 4 5removeLoading(); //ローディング画像を消すユーザー定義関数

上記の順番でプログラムを書くと

ローディング画像を表示

↓↓↓

ajax処理

↓↓↓

ローディング画像を非表示

こういう流れで表示と処理がされます。
これは問題ありません。

しかし次のような内容だと希望どおりにローディング画像が表示されません。

javascript

1dispLoading("処理中..."); 2 3//時間がかかるjavascriptの処理(ajaxでない)。 4 5removeLoading();

具体的な処理の内容は、長い文字列の操作です。

このプログラムを実行すると、ローディング画像は表示されずに、それ以外の処理が完了してしまいます。

ローディング画像が表示されないのはおかしいと思い、removeLoading() を無効にして実行しました。

こうした

javascript

1dispLoading("処理中..."); 2 3//時間がかかるjavascriptの処理(ajaxでない)。 4 5//removeLoading(); ← コメントアウト

すると、時間がかかるjavascriptの処理が完了した後、ローディング画像が表示されます。期待していたのと逆の表示順序です。

ローディング画像を表示

↓↓↓

時間がかかるjavascriptの処理(ajaxでない)

↓↓↓

ローディング画像を非表示

↑この順番でjavascriptの処理中にローディング画像を表示したいのですがどうすればいいでしょうか。なぜできないのでしょう?

よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/12/04 07:02

「時間がかかるjavascriptの処理(ajaxでない)」というのが、実は時間がかかってなくて瞬時に終了(もしくは Ajax と同様に非同期で、すぐ次の行に処理が移る)ということはないですか?
guest

回答2

0

ベストアンサー

javascript実行中は画面の描画が反映されません。
dispLoadingを実行した後に、非同期で時間がかかる処理を呼び出す必要があります。

javascript

1 2dispLoading("処理中..."); 3 4setTimeout(function() { 5 6 //時間がかかるjavascriptの処理(ajaxでない)。 7 8 removeLoading(); 9}, 0); 10

投稿2016/12/04 08:45

attercop

総合スコア246

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

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

0

1つ1つの処理の完了を待ってから実行しているわけではないからです。

ajaxを使わない書き方で書いている処理は、上の行から順番に実行されていきますが、
タイミング的にはほぼ同時に実行されています(これを非同期処理といいます)

処理1、2、3とあったら、1が実行されると、1の処理完了を待つことなくすぐ2が実行されているということです。
なので、数秒かかる処理が間に挟まっていると、意図した処理にならないことがあります。

「上の処理を終えたら、下の処理を行う」という風にするには、promiseなどの同期処理を使う必要があります。

Ajaxのcompleteなどの関数はまさにそれで、先の処理の実行完了後に呼び出される関数なので、意図した順番通りに実行されます。

投稿2016/12/04 07:25

yamato_hikawa

総合スコア2092

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問