
jQueryで、<span>タグの中の"test"を"Hello world!"に書き換えた後に、その文字列の"Hello"の部分の色を変更し、その後に、"Hello world"の真ん中の半角スペースを"␣"に変えたいと思い下記のように書きました。コメントアウトの①と②の処理を行うと、①が実行後に、②の処理で①の処理が消されてしまい、結果②だけの出力となります。①と②を同時に反映させるには、どのような書き方にすればよいでしょうか?
また、今回のコードは文字列に対して2つ処理ですが、これを同じように、③、④・・・と似たような処理を増やしていくことは可能でしょうか?
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2 …
</head>
<body>
<script>
$(document).ready(function(){
$('#text').html('Hello world!');
var text = $('#text').text();
$('#text').html(text.replace(new RegExp("Hello","g"),'<span style="color:#FF1493">Hello</span>')); //①
$('#text').html(text.replace(new RegExp( "\\s","g"),'␣')); //②
});
</script>
<span id="text">test</span>
</body>
</html>
No.3ベストアンサー
- 回答日時:
純粋なテキストだけを対象に置換を行うならば、単純に replace を重ねてください。
例)
var text = $('#text').text();
text = text.replace(/\s/g, '空白');
text = text.replace(/\d/g, '数字');
$('#text').text(text);
置換対象や置換後の文字列に HTML 構造が含まれる場合は、
HTML 要素の木構造を探って、再帰的にテキスト部を切り出し、
要素単位で置換する処理が必要となります。
例)
$('#text').each(function(){
_ R(this, /\bHello\b/i, {color:'red'}); // 見つかった箇所に span で色を付ける
_ R(this, /\bWorld\b/, 'heaven'); // 見つかった箇所をテキストで置換する
});
function R(node, re, textOrStyle) {
_ if (node.nodeType == 1) {
_ _ var a = Array.prototype.slice.apply(node.childNodes);
_ _ for (var i in a) arguments.callee(a[i], re, textOrStyle);
_ _ return;
_ } else if (node.nodeType != 3) {
_ _ return;
_ }
_ var t = node;
_ while (true) {
_ _ var m = re.exec(t.data);
_ _ if (!m) return;
_ _ var tb = (m.index == 0)? t: t.splitText(m.index);
_ _ var tc = tb.splitText(m[0].length);
_ _ if (typeof textOrStyle == 'object') {
_ _ _ var el = document.createElement('span');
_ _ _ var s = textOrStyle;
_ _ _ for (var n in s) el.style[n] = s[n];
_ _ _ el.textContent = m[0];
_ _ _ tb.parentNode.replaceChild(el, tb);
_ _ } else {
_ _ _ tb.textContent = textOrStyle;
_ _ }
_ _ t = tc;
_ }
}
ありがとうござまいす。返答を頂くまえに、なんとか自力で完成させたのですが、
回答者様が書かれたコードの方が、圧倒的に汎用性が高く、こんな書き方もあるのかと、非常に勉強になります。
No.1
- 回答日時:
「①が実行後に、②の処理で①の処理が消されてしまい」と書いているということは, 原因を理解できていないんじゃないだろうか.
①でテキストを書き換えてるけど, 変数 text の中身は変わってないよね. だから, ①で書き換える*前*のテキストに対して②で置き換えた結果になってる.
ありがとうございます。
var text = $('#text').text();
$('#text').html(text.replace(new RegExp("Hello","g"),'<span style="color:#FF1493">Hello</span>')); //①
text = $('#text').text(); //追加※1
$('#text').html(text.replace(new RegExp( "\\s","g"),'␣')); //②
※1を追加しました。
書き換えたものを、もう一度取得して、変数textに入れて、それにもう一度、処理を加えるようにしました。この状態ですと、②の処理で、書き換えられてしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スマホ上で、左右スワイプで次...
-
jQueryで同じクラス名のものを...
-
タグを教えてください。
-
ラジオボタンを複数選択したと...
-
jsで質問です。 formをsubmitし...
-
2025年相性がいい人のサイトの...
-
CookieをWebStoeageに変える
-
Adobe acrobat proでフォームを...
-
Outlookのアカウントがあるとメ...
-
jqueryのselect2で検索欄の文字...
-
<tr>指定した表の行要素をボ...
-
食材の期限を管理するためにGAS...
-
ビデオのJSについて
-
鍵盤アプリで、スマホの画面に...
-
<div>のタッチ状態を維持したま...
-
jQueryでシンセサイザーを作っ...
-
プログラミング 学習
-
HTMLでサブフレームから親のス...
-
ジャバスクリプトについて。
-
プログラムについて。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
function の return 値を表示し...
-
JavaScriptでiframeの内容を「...
-
SCRIPT5007: 未定義または NULL...
-
getElementsByNameで要素が取得...
-
キーを押している間の時間を計...
-
複雑な再帰(?)に関して
-
乱数を一定時間毎に表示させた...
-
JavaScriptでのEnterキーとAlt+...
-
javascriptでtextareaの文字列...
-
フォーカス移動抑止について
-
iframe内に表示するページを5分...
-
イメージ(画像)の上に重ねたテ...
-
ウィンドウのタイトルを変えたい
-
onmouseoverのクラス指定
-
クリックすると別の文章を表示する
-
JavaScriptについての質問です。
-
出荷予定日を表示するJavaスク...
-
bodyタグのfocus
-
JavaScript でキーを送る
-
マウスクリックした地点のテキ...
おすすめ情報
本文にもあるように②で書き換えられては困ります。①と②を同時に反映させるには、どのような書き方にすればよいでしょうか?