■ソースコード
<head>
<script>
var list = ['a', 'b', 'c', ...];
$.each(list, function(i, item) {
var max_length = item.length;
var m = '';
if (i == 0) { … [A処理]
m += '<div>';
m += '<div>';
m += '<div>';
}
<****> … [B処理]
if (i == max_length) { … [C処理]
m += '</div>';
m += '</div>';
m += '</div>';
}
$("#test").append(m);
</script>
</head>
<body>
<div id="test"></div>
</body>
■実行結果
<div><div><div> ← [a結果]
<****>
</div></div></div> ← [b結果]
<****>
<****>
;
<****> ← [c結果]ループの最後
■環境
IE10, FireFox22, Chrome28,IOS6(Safari)
■質問
ループの最後に[C処理]が行われてほしいのですが、[C処理]は実際には行われていません。
このためか、[b結果]に[C処理]があるように見えますが、これはブラウザ?が勝手につけています。これは、PCブラウザのデバッガで確認しております。max_lengthも正しいですし、固定値にしても結果は変わりません。
なぜこのようなことが起こるのでしょうか?
実際にはもう少し複雑な分岐がありますが、上記の基本動作が動かないために非常に困っております。
至急で申し訳ありませんが、アドバイスや問題点をご指摘願います!!
タグのとじ忘れとかがあるのかな。
あと、$("#test").append(m);の時点で#testが存在することが保証されていないのでお決まりの
$(function(){ document読み込み後に実行したい処理 });
が必要かと。
文字列でHTMLを組むのではなくDOMElement的(?)に組んだほうがわかりやすいと思います。
var m = $('<div>'); m.append($('<div>'));
これで↓が生成される。
<div><div></div></div>
括弧の対応がずれているのでこれでエラーなく動くとは思えません。コピペミスってませんか?
正しいコードの構造が分かりませんのでなんとも言えませんが、変数をウォッチしてみるといいかもしれませんね。
たとえば
var list = ['a', 'b', 'c']; $.each(list, function(i, item) { var max_length = item.length; console.log(i,max_length) }) //実行結果(itemは配列ではない) //0 1 //1 1 //2 1
あるいは
var list = ['a', 'b', 'c']; var max_length = list.length; $.each(list, function(i, item) { console.log(i,max_length) }) //実行結果(iはmax_lengthとイコールにならない) //0 3 //1 3 //2 3
のようなことが起きているのでは。