質問編集履歴

2

console.log()追記した結果を掲載しました。

2020/04/26 08:43

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- ### 試したこと
15
+ ### 試したこと(console.log()追記)
16
16
 
17
17
  qiitaの
18
18
 
@@ -20,6 +20,22 @@
20
20
 
21
21
  を参考にして、自分の使いたい要素に合わせて改変してみました。
22
22
 
23
+ console.log()追記後のコンソールに表示された内容は
24
+
25
+
26
+
27
+ ```consoleLog
28
+
29
+ step1
30
+
31
+ step2-2
32
+
33
+ step3
34
+
35
+ ```
36
+
37
+ です。
38
+
23
39
 
24
40
 
25
41
  ```html
@@ -74,7 +90,9 @@
74
90
 
75
91
  function waitForLoading(index, img) {
76
92
 
77
- var dfd = $.Deferred()
93
+ var dfd = $.Deferred();
94
+
95
+ console.log("step1");
78
96
 
79
97
 
80
98
 
@@ -82,23 +100,31 @@
82
100
 
83
101
  if (img.complete) {
84
102
 
103
+ console.log("step2-1");
104
+
85
105
  // すでにロードが完了していれば即時resolve。
86
106
 
87
107
  dfd.resolve()
88
108
 
89
109
  } else {
90
110
 
111
+ console.log("step2-2");
112
+
91
113
  // ロードが完了していなかった場合、イベントリスナー登録しロードの完了を待つ
92
114
 
93
115
  $(img).on('load', function () {
94
116
 
117
+ console.log("step2-2-1");
118
+
95
- resolve()
119
+ resolve();
96
120
 
97
121
  })
98
122
 
99
123
  }
100
124
 
125
+ console.log("step3");
126
+
101
- return dfd
127
+ return dfd;
102
128
 
103
129
  }
104
130
 

1

Deferredはdivのみのロードには効かないのか、検証を追記しました。

2020/04/26 08:43

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -113,3 +113,245 @@
113
113
  </html>
114
114
 
115
115
  ```
116
+
117
+
118
+
119
+
120
+
121
+ ###Deferredはdivのみのロードには効かないのか
122
+
123
+
124
+
125
+ 長文にならないようにソースや説明を最低限のものに加工してたのですが、実は
126
+
127
+ ①親ページに元からある「.first」に対して、動的にdiv「.parent」だけを挿入する
128
+
129
+ ②挿入した「.parent」に対して、動的にiframeだけを挿入する
130
+
131
+ ③「.parent」の中身をiframe中のターゲット「.my_content」のhtmlに書き換える(iframeタグ自体は消える)
132
+
133
+ ④サイズを調節した後「.parent」の高さを取る
134
+
135
+ という流れを想定していました。
136
+
137
+
138
+
139
+ moyashidaisuke様のご回答で、Deferredを使った関数はdivだけの場合効かないと知ったので、
140
+
141
+ ①部分はDeferredを使った関数を使わず、そのままappend致しました。
142
+
143
+ 「.my_content」のhtmlは「<div class="my_content">子ページです。</div>」というdivだけなので
144
+
145
+ Deferredを使った関数は不要かと思ったのですが、
146
+
147
+ Deferredを使った関数(load_content)を利用してみたところ、divだけなのに作動しました。
148
+
149
+
150
+
151
+ divだけだとDeferredが効かない場合と、
152
+
153
+ divだけなのにDeferredが効く場合の違いは何でしょうか?
154
+
155
+
156
+
157
+ ```html
158
+
159
+ <!DOCTYPE html>
160
+
161
+ <html lang="en">
162
+
163
+
164
+
165
+ <head>
166
+
167
+ <meta charset="UTF-8">
168
+
169
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
170
+
171
+ <title>親ページ</title>
172
+
173
+ <style>
174
+
175
+ *{
176
+
177
+ box-sizing: border-box;
178
+
179
+ margin: 0;
180
+
181
+ padding: 0;
182
+
183
+ }
184
+
185
+ </style>
186
+
187
+ </head>
188
+
189
+
190
+
191
+ <body>
192
+
193
+
194
+
195
+ <div class="first"></div>
196
+
197
+ <script src="/js/jquery-3.4.1.min.js"></script>
198
+
199
+ <script>
200
+
201
+ (function () {
202
+
203
+
204
+
205
+
206
+
207
+ function load_iframe() {
208
+
209
+ var deferred = $.Deferred();
210
+
211
+ var iframe = $('<iframe class="my_iframe" src="child.html"></iframe>');
212
+
213
+ iframe.on('load', deferred.resolve);
214
+
215
+ iframe.prependTo('.parent');
216
+
217
+ return deferred.promise();
218
+
219
+ }
220
+
221
+
222
+
223
+ function load_content(html) {
224
+
225
+ var deferred = $.Deferred();
226
+
227
+ var load_page = $(html);
228
+
229
+ load_page.on('load', deferred.resolve);
230
+
231
+ $('.parent').html(html);
232
+
233
+ return deferred.promise();
234
+
235
+ }
236
+
237
+
238
+
239
+ $('.first').append('<div class="parent"></div>');
240
+
241
+
242
+
243
+
244
+
245
+ var iframe_height;
246
+
247
+
248
+
249
+
250
+
251
+ $.when(load_iframe()).then(function () {
252
+
253
+
254
+
255
+ iframe_height = $('.my_iframe').contents().find('.my_content').outerHeight();
256
+
257
+ console.log("iframeのターゲットコンテンツの高さ=" + iframe_height);
258
+
259
+ var html = $('.parent .my_iframe').contents().find('.my_content').prop('outerHTML');
260
+
261
+ console.log(html)
262
+
263
+ load_content(html);
264
+
265
+
266
+
267
+
268
+
269
+ }).then(function () {
270
+
271
+ console.log("読み込み完了");
272
+
273
+ /*サイズを色々変えてみた後に高さ取得*/
274
+
275
+ $('.parent').css("padding-top", "100px");
276
+
277
+ $('.parent').css("height", 100 + iframe_height + "px");
278
+
279
+ console.log("親の高さ=" + $('.parent').outerHeight());
280
+
281
+
282
+
283
+ });
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+ }());
292
+
293
+ </script>
294
+
295
+ </body>
296
+
297
+
298
+
299
+ </html>
300
+
301
+ ```
302
+
303
+
304
+
305
+
306
+
307
+ ```html
308
+
309
+ <!DOCTYPE html>
310
+
311
+ <html lang="en">
312
+
313
+
314
+
315
+ <head>
316
+
317
+ <meta charset="UTF-8">
318
+
319
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
320
+
321
+ <title>子ページ</title>
322
+
323
+ </head>
324
+
325
+
326
+
327
+ <body>
328
+
329
+
330
+
331
+ <div class="my_content">子ページです。</div>
332
+
333
+
334
+
335
+ </body>
336
+
337
+
338
+
339
+ </html>
340
+
341
+ ```
342
+
343
+
344
+
345
+
346
+
347
+ ```consoleLog
348
+
349
+ iframeのターゲットコンテンツの高さ=24
350
+
351
+ <div class="my_content">子ページです。</div>
352
+
353
+ 読み込み完了
354
+
355
+ 親の高さ=124
356
+
357
+ ```