前提・実現したいこと
jQuery からネイティブ js への書き換えを行っています。
発生している問題・エラーメッセージ
要素それぞれに、5つずつdivで囲んだpを配置したいのですが、appendChild が上手くいきません。
ブロック内が空っぽのままになってしまいます。
エラーは特にないです。
該当のソースコード
書き換え前
js
1$('.cc').each(function () { 2 do { 3 $(this).children("p:lt(5)").wrapAll('<div></div>') 4 } while ($(this).children("p").length); 5})
生 js に書き換え
js
1let title = document.querySelectorAll(".cc p"), 2 titles = document.querySelectorAll('.cc'), 3 length_02 = title.length; 4 for (var i = 0; i < length_02; i++) { 5 if (i % 5 === 0) { 6 var div = document.createElement('div'); 7 }; 8 div.appendChild(title[i]); 9 if (i % 5 === 4) { 10 titles.forEach(function (til) { 11 til.appendChild(div); 12 }); 13 } 14 }; 15 titles.forEach(function (til) { 16 til.appendChild(div); 17 });
元のHTML
html
1<div class="cc"> 2 <p>The quick brown fox jumps over the lazy dog</p> 3 <p>The quick brown fox jumps over the lazy dog</p> 4 <p>The quick brown fox jumps over the lazy dog</p> 5 <p>The quick brown fox jumps over the lazy dog</p> 6 <p>The quick brown fox jumps over the lazy dog</p> 7 <p>The quick brown fox jumps over the lazy dog</p> 8 <p>The quick brown fox jumps over the lazy dog</p> 9 <p>The quick brown fox jumps over the lazy dog</p> 10 <p>The quick brown fox jumps over the lazy dog</p> 11 <p>The quick brown fox jumps over the lazy dog</p> 12</div> 13<div class="cc"> 14 <p>The quick brown fox jumps over the lazy dog</p> 15 <p>The quick brown fox jumps over the lazy dog</p> 16 <p>The quick brown fox jumps over the lazy dog</p> 17 <p>The quick brown fox jumps over the lazy dog</p> 18 <p>The quick brown fox jumps over the lazy dog</p> 19 <p>The quick brown fox jumps over the lazy dog</p> 20 <p>The quick brown fox jumps over the lazy dog</p> 21 <p>The quick brown fox jumps over the lazy dog</p> 22 <p>The quick brown fox jumps over the lazy dog</p> 23 <p>The quick brown fox jumps over the lazy dog</p> 24</div>
想定しているHTML
HTML
1<div class="cc"> 2 <div> 3 <p>The quick brown fox jumps over the lazy dog</p> 4 <p>The quick brown fox jumps over the lazy dog</p> 5 <p>The quick brown fox jumps over the lazy dog</p> 6 <p>The quick brown fox jumps over the lazy dog</p> 7 <p>The quick brown fox jumps over the lazy dog</p> 8 </div> 9 <div> 10 <p>The quick brown fox jumps over the lazy dog</p> 11 <p>The quick brown fox jumps over the lazy dog</p> 12 <p>The quick brown fox jumps over the lazy dog</p> 13 <p>The quick brown fox jumps over the lazy dog</p> 14 <p>The quick brown fox jumps over the lazy dog</p> 15 </div> 16</div> 17<div class="cc"> 18 <div> 19 <p>The quick brown fox jumps over the lazy dog</p> 20 <p>The quick brown fox jumps over the lazy dog</p> 21 <p>The quick brown fox jumps over the lazy dog</p> 22 <p>The quick brown fox jumps over the lazy dog</p> 23 <p>The quick brown fox jumps over the lazy dog</p> 24 </div> 25 <div> 26 <p>The quick brown fox jumps over the lazy dog</p> 27 <p>The quick brown fox jumps over the lazy dog</p> 28 <p>The quick brown fox jumps over the lazy dog</p> 29 <p>The quick brown fox jumps over the lazy dog</p> 30 <p>The quick brown fox jumps over the lazy dog</p> 31 </div> 32</div>
試したこと
forEach で囲むと空っぽになってしまいます。
document.querySelector('.cc') にして titles.appendChild(div) にすると一番最初の .cc に全部出力されるので、他のコードは合っています。
どうすればループさせることができますでしょうか。
js
1for (let cc of document.querySelectorAll('.cc')) { 2 let tp = [...cc.children].filter(child => child.matches('p')); 3 if (tp.length > 0) { 4 let div = document.createElement('div'); 5 for (let i = 0; i < 5; i = i + 1) { 6 div.appendChild(tp[i]); 7 cc.appendChild(div); 8 } 9 } 10 }
としたところ最初の5つしかdivで囲まれませんでした。
js
1for (let cc of document.querySelectorAll('.cc')) { 2 let tp = [...cc.children].filter(child => child.matches('p')); 3 if (tp.length > 0) { 4 while (tp.length) { 5 let div = document.createElement('div'); 6 for (let i = 0; i < 5; i = i + 1 ) { 7 div.appendChild(tp[i]); 8 cc.appendChild(div); 9 } 10 }; 11 } 12 }
としたところ、重すぎてページが読み込まれませんでした。
js
1for (let cc of document.querySelectorAll('.cc')) { 2 let tp = [...cc.children].filter(child => child.matches('p')); 3 tp = tp.slice(5); 4 for (let p of tp.slice(0, 5)) { 5 let div = document.createElement('div'); 6 for (let i = 0; i < 5; i = i + 1) { 7 div.appendChild(tp[i]); 8 }; 9 cc.appendChild(div); 10 }; 11 }
としたところ、.cc の初めの5つのpのみ、divで囲まれた状態になりました。
エラーは以下です。
error
1Node.appendChild: Argument 1 is not an object.
js
1for (let cc of document.querySelectorAll('.cc')) { 2 let tp = [...cc.children].filter(child => child.matches('p')); 3 for (let p of tp.slice(0, 5)) { 4 tp = tp.slice(5); 5 if (tp.length > 0) { 6 while (tp.length) { 7 let div = document.createElement('div'); 8 cc.appendChild(div); 9 div.appendChild(tp); 10 } 11 } 12 }; 13 }
としたところ、
error
1Node.appendChild: Argument 1 is not an object.
とエラーが出てしまいました。div.appendChild(tp);のところです。
何が違うのでしょうか。
js
1for (let cc of document.querySelectorAll('.cc')) { 2 let tp = [...cc.children].filter(child => child.matches('p')); 3 for (let p of tp.slice(0, 5)) { 4 if (tp.length > 0) { 5 while (tp.length) { 6 let div = document.createElement('div'); 7 cc.appendChild(div); 8 tp = tp.slice(5); 9 div.appendChild(tp); 10 } 11 } 12 }; 13 }
としたところ、
error
1Node.appendChild: Argument 1 is not an object.
とエラーが出てしまいました。div.appendChild(tp); のところです。
tp の値が違うのでしょうか。
補足情報(FW/ツールのバージョンなど)
firefox 最新版、Safari 604.1
回答2件
あなたの回答
tips
プレビュー