質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

5回答

1992閲覧

jqueryでの文字列操作についての質問

MizukiMinezaki

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

3グッド

1クリップ

投稿2016/02/10 11:51

編集2016/02/10 12:36

javascript学習中の者です。
とあるショッピングカートASPを利用して、学習を進めているのですが、
こういった感じの操作が難しく悩んでいます。
どうかご教授いただけないでしょうか。

【商品一覧出力画面】

<div class="AAA"> <div class="BBB"> <a href=""><img src=""></a> </div> 商品名<br><span>価格</span> </div>

このようなhtmlが自動出力されます。
このとき「商品名+価格」部分にCCCというclassを付けたい。
結果的には

<div class="AAA"> <div class="BBB"> <a href=""><img src=""></a> </div> <div class="CCC">商品名<br><span>価格</span></div> </div> このようなカタチにしたいと考えております。

ぜひご指導おねがいします。

luma, yamato_hikawa, torisan👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
think49

総合スコア18164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MizukiMinezaki

2016/02/10 13:44

ありがとうございます。 なるほど、このようにタグの付いていないテキストにidやclassを挿入するのですね。 大変参考になります。 ですが実際に動かしてみると、 <span>価格</span> <br> <div class="CCC">商品名</div> という結果を得ました。 最初に.AAA > .BBBと指定したからなのでしょうか。 なんだかとてもおもしろい結果です。 とても汎用的で糊代のあるコードをありがとうございます。
MizukiMinezaki

2016/02/10 14:05

querySelectorAllとArray.prototype.forEachに関しても調べました。 IEの8から使えるみたいなので、これでも学習を進めたいと思います。 本当に参考になるご回答、ありがとうございます。
think49

2016/02/10 14:50

失礼しました。ミスがあった為、親記事のコードを書き直しました。 for 文版、forEach 版ともに基本アルゴリズムは同じです。
MizukiMinezaki

2016/02/11 19:28

返信が遅れ、申し訳ありません。 ご返信並びに再考に感謝します。 ありがとうございます。 両方のコードとも、とてもためになるものです。 しっかりと学ばせていただきたいと思います。 パターンマッチすらまだ満足にできない自分なので、もっとこちらのコードを参照して、しっかりと学ばさせていただきます。 本当にありがとうございました。
guest

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

yamato_hikawa

総合スコア2092

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MizukiMinezaki

2016/02/11 19:34

ご返信感謝します。 ありがとうございます。 とてもスマートなお答えにびっくりしています。 というのも私はまだ勉強不足のため、何故この$a = $('.AAA')で.AAAの中身が取得できるのかが分かりません。 これは、表題にある出力一覧の内容が複数あっても何故いけるのでしょうか。。。 ですが出力一覧を<li>で囲って、同じ処理をした場合には何故か動かない。 謎は深まるばかりです。。。
yamato_hikawa

2016/02/12 04:29 編集

jQueryの文法で $('selector'); の形式で取得できます。 seletorの部分はCSSで使うものと同じです。 なので、class="AAA"が設定されている要素を取得する場合は $('.AAA') となります。 それを変数「$a」に入れる記述と合わせると、 $a = $('.AAA') という形になります。
guest

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

Lhankor_Mhy

総合スコア36115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MizukiMinezaki

2016/02/10 13:53

ありがとうございます。 皆さん仰る通り、やはりテキストノードの取り扱いは難しいですね。 ただ、こういった切り口もあるのですね。 とても参考になります。 AAAの中でBBBに当てはまらないものを見つけて、 最後にwrapAllするなんてこんなやり方思いつきもしませんでした。 ありがとうございます。 とても参考になるご回答、ありがとうございます。
guest

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

rossi46hiro

総合スコア992

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MizukiMinezaki

2016/02/10 14:01

ありがとうございます! たしかに!!! 決して冗長なんてことはないです。 すごい分かりやすく理詰めされた感じです。 こういう考え方をもっとできれば、楽しくなるんだろうなって感動しました。
guest

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MizukiMinezaki

2016/02/10 12:38

ありがとうございます。 まさに、その通りだと思うのですが、 その商品名の直前に来る<div>は手動では付けられず、 それさえ付けれたら。。。と考えています。 なにかよい案はないでしょうか。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問