恐れ入りますが、ご教授いただければ助かります。
imgタグを複数含む要素をjQueryベースで複製するコードを実行したところ、Firefoxでは高さが正しく取得できないことがあります。以下のようなHTMLで500×500pixelの画像を10個含むul要素を複製しています。
HTML
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <style type="text/css"> 6 * {margin: 0; padding: 0;} 7 ul {list-style: none;} 8 button {padding: 10px;} 9 </style> 10</head> 11<body> 12 <button class="copy">複製</button> 13 <ul class="images"> 14 <li><img src="images/test/01.jpg"></li> 15 <li><img src="images/test/02.jpg"></li> 16 <li><img src="images/test/03.jpg"></li> 17 <li><img src="images/test/04.jpg"></li> 18 <li><img src="images/test/05.jpg"></li> 19 <li><img src="images/test/06.jpg"></li> 20 <li><img src="images/test/07.jpg"></li> 21 <li><img src="images/test/08.jpg"></li> 22 <li><img src="images/test/09.jpg"></li> 23 <li><img src="images/test/10.jpg"></li> 24 </ul> 25 <!-- 以下のjavascriptが続きます -->
jQuery
1 <script type="text/javascript" src="js/jquery-1.9.1.js"></script> 2 <script type="text/javascript"> 3 $(document).ready(function() { 4 $('button.copy').click(function() { 5 var ul_src = $('ul.images'); 6 var ul_new1 = ul_src.clone().appendTo('body'); 7 var ul_new2 = $(ul_src.prop('outerHTML')).appendTo('body'); 8 alert( 9 'ul_src.height=' + ul_src.getHeight() + '\n' + 10 'ul_new1.height=' + ul_new1.getHeight() + '\n' + 11 'ul_new2.height=' + ul_new2.getHeight()); 12 }); 13 }); 14 $.extend(true, $.prototype, { 15 getHeight: function() { 16 return this.height(); 17 } 18 });
Chromeでは問題が起きないのですが、それはおそらく画像のキャッシュが働いているせいかと思います。
Firefoxでは要素を複製する時に、img.src先をロードする処理が走り、そのタイムラグがあるせいだと思っていますが、ロードが完了するまで待つ良い方法がわかりません。
以下のコードに変えて試してみたのですが、「too much recursion」(再帰呼び出しオーバー)となってしまいます。
jQuery
1 $.extend(true, $.prototype, { 2 getHeight: function() { 3 var imgNum = this.find('img').length; 4 var imgLoad = 0; 5 var callback = this.getHeight.bind(this); 6 while (imgLoad < imgNum) { 7 this.find('img').each(function() { 8 if (this.complete || /* for IE */ $(this).height > 0) { 9 imgLoad++; 10 } 11 }); 12 if (imgLoad == imgNum) { 13 break; 14 } 15 this.find('img').one('load', function() { 16 callback(); 17 }).load(); 18 // もしくは、setTimeoutで少し待ってみる 19 //setTimeout(callback, 100); 20 } 21 return this.height(); 22 } 23 });
どのようにすれば、画像のロード完了を待った後に、要素の高さを取得することができるでしょうか?
詳しい方にご教授いただければ。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー