javascript学習中の者です。
とあるショッピングカートASPを利用して、学習を進めているのですが、
こういった感じの操作が難しく悩んでいます。
どうかご教授いただけないでしょうか。
【商品一覧出力画面】
<div class="AAA"> <div class="BBB"> <a href=""><img src=""></a> </div> 商品名<br><span>価格</span> </div>このようなhtmlが自動出力されます。
このとき「商品名+価格」部分にCCCというclassを付けたい。
結果的には
ぜひご指導おねがいします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
jQuery はテキストノードAPIがほとんどないので DOM API を利用してください。
HTML
1<div class="AAA"> 2 <div class="BBB"> 3 <a href=""><img src=""></a> 4 </div> 5 商品名<br><span>価格</span> 6</div> 7<div class="AAA"> 8 <div class="BBB"> 9 <a href=""><img src=""></a> 10 </div> 11 商品名<br><span>価格</span> 12</div> 13<script> 14'use strict'; 15(function () { 16 var doc = document, 17 div = doc.createElement('div'); 18 19 div.className = 'CCC'; 20 21 for (var i = 0, aaas = doc.querySelectorAll('.AAA'), l = aaas.length, aaa; i < l; ++i) { 22 aaa = aaas[i]; 23 24 for (var j = 0, childNodes = aaa.childNodes, m = childNodes.length, childNode, div = div.cloneNode(false); j < m; ++j) { 25 childNode = childNodes[j]; 26 27 if (childNode.classList && childNode.classList.contains('BBB')) { 28 while (++j < m--) { 29 div.appendChild(childNodes[j]); 30 } 31 32 if (div.childNodes.length) { 33 aaa.appendChild(div); 34 } 35 break; 36 } 37 } 38 } 39}()); 40</script>
(2016/02/10 23:48追記)
コードに誤りがあった為、querySelectorAll()
で書き直しました。
Array.prototype.forEach
を使うと次のように書けます。
JavaScript
1'use strict'; 2Array.prototype.forEach.call(document.querySelectorAll('.AAA'), function (aaa) { 3 var doc = aaa.ownerDocument, 4 div = doc.createElement('div'); 5 6 div.className = 'CCC'; 7 8 for (var j = 0, childNodes = aaa.childNodes, m = childNodes.length, childNode, div = div.cloneNode(false); j < m; ++j) { 9 childNode = childNodes[j]; 10 11 if (childNode.classList && childNode.classList.contains('BBB')) { 12 while (++j < m--) { 13 div.appendChild(childNodes[j]); 14 } 15 16 if (div.childNodes.length) { 17 aaa.appendChild(div); 18 } 19 break; 20 } 21 } 22});
Re: MizukiMinezaki さん
投稿2016/02/10 12:38
編集2016/02/10 14:48総合スコア18164
0
解決してますが、こちらでも出来たので紹介します。
javascript
1var $a = $('.AAA'), 2 $b = $('.BBB'), 3 /* $aの中から$b以外の要素を$targetとして取得 */ 4 $target = $a.contents().not($b), 5 /* $targetを内包したCを作成 */ 6 $c = $('<div class="CCC">').html($target); 7 8/* $cを$bの後ろに挿入 */ 9$b.after($c);
投稿2016/02/10 17:29
総合スコア2092
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/12 04:29 編集
0
ベストアンサー
jQueryさんの弱点はテキストノードを扱えないことなので、なかなか大変かな、と。
javascript
1$( 2 Array.prototype.filter.call( 3 document.getElementsByClassName('AAA')[0].childNodes, 4 (function(){ 5 var f = false; 6 return function(node){ 7 if (!f && node.nodeType === 1) { 8 f = node.classList.contains('BBB') 9 } 10 return f; 11 } 12 })() 13 ).slice(1) 14).wrapAll('<div class="CCC">');
投稿2016/02/10 13:12
総合スコア36115
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/10 13:53
0
ちょっと冗長な書き方になってしまいますが、これでどうでしょう。
Javascript
1$(".BBB").insertAfter(".AAA"); 2$(".BBB").after('<div class="ccc"></div>'); 3var aaaHtml = $(".AAA").html(); 4$(".ccc").append(aaaHtml); 5$(".AAA").empty(); 6$(".BBB, .ccc").appendTo(".AAA");
投稿2016/02/10 13:15
総合スコア992
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/10 14:01
0
いかがですか。
html
1<div class="AAA"> 2 <div class="BBB"> 3 <a href=""><img src=""></a> 4 </div> 5 <div>商品名<br><span>価格</span></div> 6</div>
javascript
1$('.BBB').next('div').addClass('ccc');
投稿2016/02/10 12:26
編集2016/02/10 12:35退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/10 12:38
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/10 13:44
2016/02/10 14:05
2016/02/10 14:50
2016/02/11 19:28