アプリ版:「スタンプのみでお礼する」機能のリリースについて

jQuery text()で、<br>と<br />タグも取得したいのですが、どうすれば良いでしょうか?
$("p.hoge").html();で取得すると、それ以外のタグも取得されてしまいます。
欲しいのは、「テキスト+<br>+<br />」です

あるいは、html()で指定範囲を全て取得して、そこから、「<br>と<br />」以外の全てのhtmlタグを削除、
というのは、出来るでしょうか?

A 回答 (2件)

かいせつですか…。

コードをかくより めんどうだなぁ…
--

Array.map は、ある配列をもとに新たな配列を得るために使われます。
Array.filter は、ある配列の中で、条件を満たしたものを得るために使われます。

--
nodeList = document.getElementsByTagName ('xxx');
nodeList = document.getElementById ('xxx').childNodes;
nodeList = document.form[0].elements;

このように集められるノードリストは、一見すると配列を返しているように思えますが、そうではありません。
配列ではないので Array.map などは使えません。

nodeList.forEach (function (e) { alert (e.tagName); });//このコードは走りません。

--
以後、理解しやすいように勝手に解釈します。map 関数は、内部にある。その関数はきっと
Array.map = map;
のようにして、Array に関連付けられている。普通には呼び出せない。その関数を呼び出す方法が、
Array.prototype.map.call (nodeList, cbFunc);

--
getSison 関数は、ルートノードを引数に渡すと、まずその子ノードリストを順に調べ、それ以下のノードリストを配列として返します。
ary = [ [3,4,5], [6,7], [8], [9,10] ,........ ];
戻り値はきっと上のようになるかもしれない。(子ノードの数で配列の大きさが変化する)
この配列を一気に一つの配列にする方法は、ないものだろうか?
配列をつなげる関数は、concat 。
var ary = [0,1,2].concat ([3,4,5], [6,7], [8], [9,10]); // ary = [0,1,2,3,4,5,6,7,8,9]
map と同じように concat 関数そのものを呼び出すには、

var ary = Array.prototype.concat.call ([0,1,2], [3,4,5], [6,7], [8], [9,10]);

しかし、子ノードの数で concat に渡す引数が変化してしまう。
上の式で言えば、getSison 関数で、root ノードの子ノードは、[[3,4,5], [6,7], [8], [9,10]]のような形で配列になって返される(再帰処理で)。
var child = [[3,4,5], [6,7], [8], [9,10]];
var ary = [root];
var rst = Array.prototype.concat.apply (ary, child);

call ではなく、 apply を使って呼び出すと child の配列の数が何個でも concat 関数の引数として渡される。
つまり、引数として渡された配列は、すべて1つになる。
--
>> var sison = getSison (document.getElementById ('hoge')).filter (isTarget);
の、
getSison (document.getElementById ('hoge'))
は、hoge をルートとする子孫ノードを配列として返す。
[hoge, node0, node1, .....]
このリストから、目的のノードを Array.filter で選別する。

--
で、かいせつに なっているだろうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

>かいせつですか…。コードをかくより めんどうだなぁ…
ごめんなさい……

>で、かいせつに なっているだろうか?
詳細ありがとうございました。ものすごく(解説に)なっています。
大変、勉強になりましたー!

お礼日時:2012/09/09 09:19

またも、jQuery なんて つかわなくても あつめられます。


しそんノードをあつめて、ひつようなノードだけを はいれつにして かえします。
「削除」のほうは、ひとまかせにします。
Array.map と Array.filter が ひつようです。


<!DOCTYPE html>
<title></title>
<meta charset="UTF-8">
<div id="hoge">
 <p>
  1<em>2</em>3<br>
  4
 </p>
 <p>
  5<br>
  6
 </p>
</div>


<script>

function isTarget (n) {
 return ((3 === n.nodeType) || 'BR' === n.tagName);
}


function getSison (n) {
 return n.hasChildNodes ()
  ? Array.prototype.concat.apply ([n],
    Array.prototype.map.call (n.childNodes, getSison))
  : n;
}


var sison = getSison (document.getElementById ('hoge')).filter (isTarget);

</script>

この回答への補足

かいとうありがとうございました。
だけど、かいているないようがむずかしいので、かいせつしていただくことはかのうでしょうか?

初めの、
filter (isTarget);
では、「テキストかbrタグだったら、新しい配列を作る」、ということなのでしょうか?

getSison関数に渡された引数に子ノードがあったら、
何をしているのでしょうか?
Array.prototype.concat.apply ([n],???

再び、元の関数を呼んでいるので、
Array.prototype.map.call (n.childNodes, getSison))
再帰処理とかなのでしょうか?

補足日時:2012/09/09 01:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!