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

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

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

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

jQuery

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

Q&A

解決済

1回答

1280閲覧

Javascriptの実行順序について

samuraiders

総合スコア63

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2016/08/25 07:23

###前提・実現したいこと
動的にセレクトメニューを追加/削除し、且つ選択した値は他のセレクトメニューでは選択できないよう制御するフォームを作成しております。

フォーム自体は完成したのですが、元々書いていたコードでは意図した動きとならず、以下に記載するように記載すると意図した動作となりました。

###該当のソースコード
問題箇所のみ抜粋(意図した動作):

// (-)buttonがクリックされた時の処理 $(document).on('click', '.del', function(){ var removeObj = $(this).parent(); removeObj.fadeOut('fast', function() { removeObj.remove(); console.log('#1'); // 番号振り直し frm_cnt = 0; $(".custom-block[id^='custom-block']").each(function(idx, obj) { if ($(obj).attr('id') != 'custom-block[0]') { frm_cnt++; $(obj) .attr('id', 'custom-block[' + frm_cnt + ']') // id属性を変更。 .find('select').each(function(idx, obj) { $(obj).attr({ id: $(obj).attr('id').replace(/\[[0-9]\]+$/, '[' + frm_cnt + ']'), name: $(obj).attr('name').replace(/\[[0-9]\]+$/, '[' + frm_cnt + ']') }); }); } }); // option再生成 console.log('#2'); generateOptions(); console.log('#3'); }); });

問題箇所のみ抜粋(意図しない動作):

// (-)buttonがクリックされた時の処理 $(document).on('click', '.del', function(){ var removeObj = $(this).parent(); removeObj.fadeOut('fast', function() { removeObj.remove(); console.log('#1'); // 番号振り直し frm_cnt = 0; $(".custom-block[id^='custom-block']").each(function(idx, obj) { if ($(obj).attr('id') != 'custom-block[0]') { frm_cnt++; $(obj) .attr('id', 'custom-block[' + frm_cnt + ']') // id属性を変更。 .find('select').each(function(idx, obj) { $(obj).attr({ id: $(obj).attr('id').replace(/\[[0-9]\]+$/, '[' + frm_cnt + ']'), name: $(obj).attr('name').replace(/\[[0-9]\]+$/, '[' + frm_cnt + ']') }); }); } }); }); // option再生成 console.log('#2'); generateOptions(); console.log('#3'); });

(-)ボタンをクリックした際、それぞれ #1 -> #2 -> #3 の順に実行されると思ってましたが、意図しない動作の場合、 #2 -> #3 -> #1 の順に実行されます。

プログラムは上から下に流れるものとの思い込みなのかもしれませんが、何故意図しない動作となるか理由をご教授頂けないでしょうか。

以上、よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

JavaScript

1// (-)buttonがクリックされた時の処理 2$(document).on('click', '.del', function(){ 3 var removeObj = $(this).parent(); 4 removeObj.fadeOut('fast', function() { 5 removeObj.remove(); 6 console.log('#1'); 7 // 中略 8 }); 9 // option再生成 10 console.log('#2'); 11 generateOptions(); 12 console.log('#3'); 13});

fadeOutメソッドは
「今からフェードアウトを始めてください。終わったら2番めの引数に指定した関数(ここに"#1"の表示が含まれている)を呼んでください」
というお願いをするだけの命令で、すぐさま(フェードアウトの完了を待たずに)次の処理、すなわち#2と#3の表示へと処理が移っていきます。
その後、フェードアウトが完了した時点で"#1" の表示がされるので、結果として
"#2" -> "#3" -> "#1"
の順に表示されます

投稿2016/08/25 07:39

編集2016/08/25 07:41
hoge1e3

総合スコア19

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

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

samuraiders

2016/08/25 07:54 編集

ご確認頂き、ありがとうございます。 なるほど。 fadeOutの場合完了を待たずに次の処理が実行されてしまうということですね。 それでコールバック関数内に書かれていれば意図した動作をするが、そうでなければ動作しない理由が納得できました。 こういう動作をするものを非同期処理という言葉で表すと認識してますが、あってますでしょうか。
hoge1e3

2016/08/25 09:35

はい、並行して行われる他の処理が終わるのを待つことを「同期」と呼ぶので、その反対、つまり待たずに先に進んで、処理終了後にコールバックがかかる処理のことを非同期処理と呼ぶようです。
samuraiders

2016/08/25 11:26

ありがとうございます。 お陰様で、理解が深まりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問