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

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

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

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

jQuery

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

Q&A

解決済

1回答

3713閲覧

jQueryでイベント後に処理を行う方法

mocchi

総合スコア15

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2016/06/10 10:08

これはちょっと試しに書いたコードですがajaxでデータを取ってきた後そのデータで設定(setGrid)
を行います。(bootstrapのcollapseを使用しています)

$.when( ajaxGet(url) ) .done(function(data) { var procSetting = (function () { var d = new $.Deferred(); //ajaxでとってきた値での設定 var setGrid = (function () { return function () { console.log("setGrid"); }; }()); return function (collapseopened) { if( collapseopened ){ $('#collapse').addClass('no-transition'); $('#collapse').bind('shown.bs.collapse',function(e){ setGrid(); $(this).unbind(e); $(this).collapse('hide'); $(this).removeClass('no-transition'); d.resolve(); }) $('#collapse').collapse('show'); } else{ setGrid(); d.resolve(); } }; return d.promise(); }()); $.when( procSetting( $('#collapse').is(':hidden') ) ).done(function() { console.log("proc2"); }); }) .fail(function() { console.log("ajax fail"); });

このコードだと$('#collapse')が非表示の場合(つまり閉じているとき)setGrid()より先に
proc2が表示されます。procSettingの処理はshowで終わっているので当然だとは思うので
すが、shown.bs.collapseのハンドラで書いている処理をproc2より先に行いたいのです。

何がしたいかというと
「collapseが開いてなかったら開いてからsetGrid()の処理をしてcollapseを閉じます。そのあとにproc2の処理が行われるようにしたい」
ということなのですがいまいちjavascriptは勉強不足のためうまく動く書き方が導き出せていません。解決方法のヒントがあれば教えて下さい。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ちょっとDeferredの使い方が間違っているかと思います。
本来procSettingがd.promise()を返し、そのdoneを見るべきです。いまのコードのおかしなところは、クロージャを使うためにreturnがfunctionになってしまっていることです。return d.promise()の前にreturn functionになってますよね?いまのコード的に、あまりクロージャでやる利点がないように見えます。以下のようにコードを変えてみてはいかがでしょう?
(流れのみを見やすくするためいろいろコードは削ってます)

Javascript

1$(function(){ 2 $.when(function(){ 3 console.log("ajaxGet"); 4 }).done(function(){ 5 var procSetting = function(collesponded){ 6 var d = $.Deferred(); 7 if( collapseopened ){ 8 $('#collapse').bind('shown.bs.collapse',function(e){ 9 d.resolve(); 10 }); 11 $('#collapse').collapse('show'); 12 } 13 else{ 14 d.resolve(); 15 } 16 return d.promise(); 17 } 18 procSetting(true).done(function(){ 19 console.log("proc2"); 20 }); 21 }); 22});

投稿2016/06/11 01:01

masaya_ohashi

総合スコア9206

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

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

mocchi

2016/06/13 01:36

>クロージャを使うためにreturnがfunctionになってしまっていることです 確かにそうですね。アドバイス通りにするとうまくいくことを確認できました。 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問