jQuery初心者です。
図のような構造のコーディングをしております。
それぞれ違う高さの画像を横並びにしており、高さが540px以上のliに対してheightというclassを付与するにはどうしたらよいでしょうか?
HTMLは、下記です。
----------------------------------------------------
<ul id="cont">
<li><a href="#"><img src="" /></a></li>
<li><a href="#"><img src="" /></a></li>
<li><a href="#"><img src="" /></a></li>
<li><a href="#"><img src="" /></a></li>
</ul>
----------------------------------------------------
下記のようなスクリプトを書きましたがダメでした。
----------------------------------------------------
var height = $('#conts li').height();
$(function(){
$('#conts li').each(function(){
if(height > 540){
$(this).addClass('height');
}
});
});
----------------------------------------------------
こんな感じで、いけると思います。
<script> $(function(){ $('#conts li').each(function(){ var h = $(this).height(); if (h > 540) { $(this).addClass('height'); } }); }); </script> <style> .height { ... } </style> <ul id="conts"> <li><a href="#"><img src="..." /></a></li> <li><a href="#"><img src="..." /></a></li> <li><a href="#"><img src="..." /></a></li> <li><a href="#"><img src="..." /></a></li> </ul>
質問にあったコードだと、jQuery のセレクタと、HTML で UL の ID が違ってたんで、"conts" に合わせてあります。
「setTimeout()で、要素ができあがるまでリトライ」するにはどうしたらいいでしょうか?
こんな感じ。
$(function(){ setTimeout(function() { //console.log("..."); ※ここに console.log を仕込んでおくと、動作が分かると思います if ($('#conts li').each(function(){ var h = $(this).height(); if (h > 540) { $(this).addClass('height'); } }).length == 0) { setTimeout(arguments.callee, 500); } }, 500); });
.each() の戻り値は、セレクタで集めた jQuery オブジェクトそのものです。
.each() で、クラスの付加をチャレンジして、その対象がゼロ個だったら、もう一度 setTimeout します。
関数の中での arguments.callee は、その関数そのものを表します。なので、以下の関数 foo は、自分自身を 500ms ごとに繰り返すことになります。
function foo() { ... setTimeout(arguments.callee, 500); }
なぜかうまくいきませんでしたが、原因が分かりました。
上記、
<LI>ー</LI>
がJSプラグインで書き出されたHTMLでした。
これらを選択するにはどうしたらよいでしょうか?
--------------------------------------------------------------------
var j$ = jQuery;
setTimeout(function(){
j$(function () {
$('#conts li').each(function(){
var h = $(this).height();
if (h > 540) {
$(this).addClass('height');
}
});
});
},2000);
で実行OKでした。
ただ、、2000で時間固定しているので、通信が遅れた場合に、実行されるか心配です。
「setTimeout()で、要素ができあがるまでリトライ」するにはどうしたらいいでしょうか?
参考URLを送っていただけるのみでもOKです。
--------------------------------------
a-kuma3さん
丁寧な説明ありがとうございました。
ベストアンサーとさせていただきます。
最後のsetTimeoutのスクリプトですが、ローカルのHTML上では動作しましたが、WordPress上では動作確認ができずで、とりあえず時間をずらしたsetTimeoutスクリプトを5個くらい配置して応急処置をしました。
今回の質問に対する回答としましては、以上で十分ですので閉じさせていただきます。