- ベストアンサー
jQueryの処理順序について
- jQueryの処理順序についての質問です。PCでは想定通り動作しますが、iPhoneとAndroidでは動作しません。
- 特に、処理の冒頭にクリックされたボタンをloading画像に置換する処理を入れていますが、その前にAjaxでの処理が完了してしまいます。
- 関数の中のhtml置換処理を、上の行から順番通りに実行させる方法はありますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
今ではasync:falseは非推奨ですよ。 やりたいことは分かりますが、素直に非同期にして、completeやsuccessの中にajax完了後の処理を書くのが分かりやすいと思います。もし、それができない状況だとしたら、それをできない状況自体を改善すべきです。 あと、最新のjQueryではajaxの使い方も変わってきてる(使いやすくなってる)ので、古いソースではなく、新しいjQueryの情報を確認されたほうがよいと思いますよ。
その他の回答 (2)
- fujillin
- ベストアンサー率61% (1594/2576)
よくわかっていませんが… (よこから失礼) >同期通信をしています DOMは変更されていても、ブラウザが画像データを取得したり画面に反映したりできないだけでは? 非同期通信にしてみたらどうなるでしょうか?
- think49
- ベストアンサー率59% (285/482)
.html('loading.gif'); のコードでは "loading.gif" という文字列が挿入されるだけで画像ファイルとはなりません。 http://jsfiddle.net/NgZAZ/ http://api.jquery.com/html/#html2 もし、画像になるのならそれは別の処理が働いているからです。 そのコードを特定してください。 最も、初めから .html() でimg要素を挿入すればいい話だとは思いますが…。 > loading画像に書き換わる前にAjaxでの処理が完了してしまいます。 Ajax処理との関係性が書かれていないのでなんともいえませんが、Ajaxは非同期処理であることに気をつけてください。
補足
すいません、抜粋するつもりが壮大にサンプルソースを書き間違えていました。 サンプルソースを訂正します。 function ajaxAddHtmlBeforeId(php_func, target_id) { $('#' + target_id).html(_getLoadingImageHtml()); //↓Ajaxの処理 // ・・・ //↓ローディング画像を戻す処理 // ・・・ } function _getLoadingImageHtml() { return '<img src="/images/loading.gif" />'; } 要点を整理しますと、 ・スマホでは冒頭のローディング画像の表示処理がされないまま処理が完了してしまう。 ⇒その他のAjaxなどその他の処理は問題ない。 ・async:falseで同期通信をしています。 ・PCではすべて想定通り動いています。 です。 引き続きご回答お待ちしています。
補足
tracerさん、fujillinさんからご指摘いただいた通り、まず非同期通信を前提とし、 ajaxStart、ajaxCompleteのコールバック関数で制御することでうまくいきました。 最終的にはローディング画像はdiplay:noneで定義しておき、 コールバック関数でdiplayを切り替えるというシンプルな方法で実装しました。 こんな感じです。 ------------------------------ $("#" + target_id).ajaxStart(function(){ $("#ajaxLoadingImage").css('display','block'); }); $("#" + target_id).ajaxComplete(function(){ $("#ajaxLoadingImage").css('display','none'); }); ------------------------------ とても助かりました。 ありがとうございました!