teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

インデント等を調整

2019/11/10 10:37

投稿

kannmuri
kannmuri

スコア42

title CHANGED
File without changes
body CHANGED
@@ -121,7 +121,7 @@
121
121
 
122
122
  /*
123
123
  【変更➀】
124
- この部分を myFadeOut() と関数化し、26行目の getAjaxData() の場所に書いてみました
124
+ この部分を myFadeOut() と関数化し、getAjaxData() の場所に書いてみました
125
125
  $('section').fadeOut(1000, function(){
126
126
  var html = getHtml(area);
127
127
  $('section').html(html);

3

追記

2019/11/10 10:37

投稿

kannmuri
kannmuri

スコア42

title CHANGED
File without changes
body CHANGED
@@ -28,8 +28,8 @@
28
28
  ```
29
29
  ```jQeury
30
30
  $('button').click(function(){
31
- const area = $(this).attr('data-area');
31
+ const area = $(this).attr('data-area');
32
- Pjax(area);
32
+ Pjax(area);
33
33
  });
34
34
 
35
35
  function Pjax(area){
@@ -42,8 +42,8 @@
42
42
  // 表示切替
43
43
  $('body').append('<p class="loading">loading</p>')
44
44
  $('section').fadeOut(1000, function(){
45
- var html = getHtml(area);
45
+ var html = getHtml(area);
46
- $('section').html(html);
46
+ $('section').html(html);
47
47
  });
48
48
 
49
49
  $.Deferred().resolve().then(function() {
@@ -71,11 +71,11 @@
71
71
  function getHtml(area){
72
72
  let html;
73
73
  if( area == 'one' ){
74
- html = `<div data-area="one"></div>`;
74
+ html = `<div data-area="one"></div>`;
75
- }
75
+ }
76
76
  else if( area == 'two' ){
77
- html = `<div data-area="two"></div>`;
77
+ html = `<div data-area="two"></div>`;
78
- }
78
+ }
79
79
  return html;
80
80
  }
81
81
  ```
@@ -88,4 +88,94 @@
88
88
 
89
89
  以上2点からAjaxの処理速度が原因だ!と思い込んでいますが、もしかしたら他の原因かもしれません。
90
90
 
91
- どうすればAjaxの処理速度にかかわらず、実現したい順番で処理できるでしょうか。
91
+ どうすればAjaxの処理速度にかかわらず、実現したい順番で処理できるでしょうか。
92
+
93
+ ###試したこと(追記)
94
+ ご回答の中に
95
+ `$.Deferred().resolve().then(function() {`ではなく
96
+ `$.when()`を使えとのアドバイスを頂きました。
97
+
98
+ その理由として自分なりに推測したのは、
99
+
100
+ 3.`<div>`に「Ajaxデータ」を挿入
101
+ のために待たなければならない処理が
102
+
103
+ 1.`<section>`を`fadeOut()`
104
+ 2.`<section>`に`<div>`を挿入
105
+ と2つあり、
106
+
107
+ そのように複数の処理を待つ場合は`$.Deferred().resolve().then(function() {`では対応できないためだと考えました。
108
+
109
+ 以上のように考え、修正したのが次のコードです。【変更➀】と【変更➁】が上の推測に沿った修正になります。
110
+
111
+ ```jQeury
112
+ $('button').click(function(){
113
+ const area = $(this).attr('data-area');
114
+ Pjax(area);
115
+ });
116
+
117
+ function Pjax(area){
118
+
119
+ // 表示切替
120
+ $('body').append('<p class="loading">loading</p>');
121
+
122
+ /*
123
+ 【変更➀】
124
+ この部分を myFadeOut() と関数化し、26行目の getAjaxData() の場所に書いてみました
125
+ $('section').fadeOut(1000, function(){
126
+ var html = getHtml(area);
127
+ $('section').html(html);
128
+ });
129
+ */
130
+
131
+ /*
132
+ 【変更➁】
133
+ 2つの処理完了を待つため $.when().done() に変更しました
134
+ */
135
+ $.when(
136
+ myFadeOut(area,1000), getAjaxData(100)
137
+ )
138
+ .done(function(ajaxData) {
139
+ console.log(ajaxData);
140
+ $('body').find('.loading').remove();
141
+ $('section').find('div[data-area="'+area+'"]').html('<p>'+ajaxData+'</p>');
142
+ $('section').fadeIn(1000, function(){
143
+ //history.pushState(location.href);
144
+ });
145
+ });
146
+ }
147
+
148
+ // 【変更➀】の関数
149
+ function myFadeOut(area,dalution){
150
+ const d = new $.Deferred;
151
+ $('section').fadeOut(dalution, function(){
152
+ var html = getHtml(area);
153
+ $('section').html(html);
154
+ d.resolve();
155
+ });
156
+ return d.promise();
157
+ }
158
+
159
+ function getAjaxData(delay){
160
+ const d = new $.Deferred;
161
+ setTimeout(function(){ // テストのためAjaxの代わりにsetTimeOut
162
+ const ajaxData = 'Ajaxデータ';
163
+ d.resolve(ajaxData);
164
+ }, delay);
165
+ return d.promise();
166
+ }
167
+
168
+ function getHtml(area){
169
+ let html;
170
+ if( area == 'one' ){
171
+ html = `<div data-area="one"></div>`;
172
+ }
173
+ else if( area == 'two' ){
174
+ html = `<div data-area="two"></div>`;
175
+ }
176
+ return html;
177
+ }
178
+ ```
179
+ ですが、、これでもできず、再び限界になりここに追記させて頂きました。
180
+
181
+ 解決できる方がいらっしゃいましたらご回答頂けましたら幸いです。

2

タイトル訂正

2019/11/10 10:34

投稿

kannmuri
kannmuri

スコア42

title CHANGED
@@ -1,1 +1,1 @@
1
- Ajaxコールバックでタイミングが整合できず…
1
+ Ajaxでタイミングが整合できず…
body CHANGED
File without changes

1

リンク訂正

2019/11/08 11:52

投稿

kannmuri
kannmuri

スコア42

title CHANGED
File without changes
body CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  問題は★の数値(jsfiddleでいう21行目)で、これがAjaxの処理速度(つまりsetTiemout速度)を示すのですが、もし`fadeOut()`より早い場合に問題が生じます。
18
18
 
19
- ???? [https://jsfiddle.net/8wzrs5km/](https://jsfiddle.net/8wzrs5km/)
19
+ ???? [https://jsfiddle.net/v8pmcsak/](https://jsfiddle.net/v8pmcsak/)
20
20
  ```HTML
21
21
  <main>
22
22
  <section>