質問編集履歴

1

もう1つ試したこととしてsetTimeoutを追加しました。

2019/10/22 00:08

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,5 @@
1
+ 恐れ入りますが、ご教授いただければ助かります。
2
+
1
3
  imgタグを複数含む要素をjQueryベースで複製するコードを実行したところ、Firefoxでは高さが正しく取得できないことがあります。以下のようなHTMLで500×500pixelの画像を10個含むul要素を複製しています。
2
4
 
3
5
 
@@ -52,6 +54,12 @@
52
54
 
53
55
  </ul>
54
56
 
57
+ <!-- 以下のjavascriptが続きます -->
58
+
59
+ ```
60
+
61
+ ```jQuery
62
+
55
63
  <script type="text/javascript" src="js/jquery-1.9.1.js"></script>
56
64
 
57
65
  <script type="text/javascript">
@@ -60,15 +68,15 @@
60
68
 
61
69
  $('button.copy').click(function() {
62
70
 
63
- var ul_org = $('ul.images');
71
+ var ul_src = $('ul.images');
64
72
 
65
- var ul_new1 = ul_org.clone().appendTo('body');
73
+ var ul_new1 = ul_src.clone().appendTo('body');
66
74
 
67
- var ul_new2 = $(ul_org.prop('outerHTML')).appendTo('body');
75
+ var ul_new2 = $(ul_src.prop('outerHTML')).appendTo('body');
68
76
 
69
77
  alert(
70
78
 
71
- 'ul_org.height=' + ul_org.getHeight() + '\n' +
79
+ 'ul_src.height=' + ul_src.getHeight() + '\n' +
72
80
 
73
81
  'ul_new1.height=' + ul_new1.getHeight() + '\n' +
74
82
 
@@ -76,89 +84,89 @@
76
84
 
77
85
  });
78
86
 
79
- })
87
+ });
88
+
89
+ $.extend(true, $.prototype, {
90
+
91
+ getHeight: function() {
92
+
93
+ return this.height();
94
+
95
+ }
96
+
97
+ });
80
98
 
81
99
  ```
82
100
 
83
- ```jQuery
84
-
85
- $.extend(true, $.prototype, {
86
-
87
- getHeight: function() {
88
-
89
- return this.height();
90
-
91
- }
92
-
93
- });
94
-
95
- ```
96
-
97
- 以下は成功した時です。
101
+ 以下は成功した時です。※時々、成功します。
98
102
 
99
103
  ![成功](7c996c38662d843d5c808ee5b99066b7.jpeg)
100
104
 
101
105
 
102
106
 
103
- 以下は失敗した時です。
107
+ 以下は失敗した時です。※大抵、失敗します。
104
108
 
105
109
  ![イメージ説明](a1136397a89b37c32973427cb8ebb1eb.jpeg)
106
110
 
107
111
 
108
112
 
109
- Chromeでは問題が起きないのですが、おそらく画像のキャッシュが働いているせいかと思います。
113
+ Chromeでは問題が起きないのですが、それはおそらく画像のキャッシュが働いているせいかと思います。
110
114
 
111
115
  ![イメージ説明](c7766179e9b2f39642c73d4c4ccfdd85.jpeg)
112
116
 
113
117
 
114
118
 
115
- Firefoxでは要素を複製する時に、img.src先をロードする処理が走り、そのタイムラグがあるだと思いますが、ロードが完了するまで待つ良い方法が思いつきません。
119
+ Firefoxでは要素を複製する時に、img.src先をロードする処理が走り、そのタイムラグがあるせいだと思っていますが、ロードが完了するまで待つ良い方法がわかりません。
116
120
 
117
- 以下のコードを入れて試してみたのですが、「too much recursion」(再帰呼び出しオーバー)となってしまいます。
121
+ 以下のコードに変えて試してみたのですが、「too much recursion」(再帰呼び出しオーバー)となってしまいます。
118
122
 
119
123
  ```jQuery
120
124
 
121
- $.extend(true, $.prototype, {
125
+ $.extend(true, $.prototype, {
122
126
 
123
127
  getHeight: function() {
124
128
 
125
- var imgNum = this.find('img').length;
129
+ var imgNum = this.find('img').length;
126
130
 
127
- var imgLoad = 0;
131
+ var imgLoad = 0;
128
132
 
129
- var callback = this.getHeight.bind(this);
133
+ var callback = this.getHeight.bind(this);
130
134
 
131
- while (imgLoad < imgNum) {
135
+ while (imgLoad < imgNum) {
132
136
 
133
- this.find('img').each(function() {
137
+ this.find('img').each(function() {
134
138
 
135
- if (this.complete || /* for IE */ $(this).height > 0) {
139
+ if (this.complete || /* for IE */ $(this).height > 0) {
136
140
 
137
- imgLoad++;
141
+ imgLoad++;
138
142
 
139
- }
143
+ }
140
144
 
141
- });
145
+ });
142
146
 
143
- if (imgLoad == imgNum) {
147
+ if (imgLoad == imgNum) {
144
148
 
145
- break;
149
+ break;
146
-
147
- }
148
-
149
- this.find('img').one('load', function() {
150
-
151
- callback();
152
-
153
- }).load();
154
150
 
155
151
  }
156
152
 
153
+ this.find('img').one('load', function() {
154
+
155
+ callback();
156
+
157
+ }).load();
158
+
159
+ // もしくは、setTimeoutで少し待ってみる
160
+
161
+ //setTimeout(callback, 100);
162
+
163
+ }
164
+
157
- return this.height();
165
+ return this.height();
158
166
 
159
167
  }
160
168
 
161
- });
169
+ });
162
170
 
163
171
  ```
164
172