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

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

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

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

jQuery

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

Q&A

解決済

2回答

1128閲覧

検索結果にもターゲットに振った番号を反映させたい

erp

総合スコア46

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2021/05/25 11:50

編集2021/06/03 07:32

前提・実現したいこと

リアルタイム検索で、ターゲットエリアの文章にcss counterで文頭に番号を振っています。検索結果にもその番号を反映させたいのですがやり方が分かりません。大幅にコードを書き替えることなく、書き足す形で実現したいです。
参考:https://www.tam-tam.co.jp/tipsnote/javascript/post11315.html


結果(#search-result__list)に出力された<p>の内容が、<p>112あのイーハトーヴォの</p> のように、数字と内容が一続きになってしまうのですが、どうすれば数字を<span>で囲めますか?

また、ハイライトのコードと、上記のコードが機能しません。よく分からないです。

該当のソースコード

js

1// keywords search 2 searchWord = function () { 3 var searchResult, 4 searchText = $(this).val(), // 検索ボックスに入力された値 5 targetText, 6 hitNum; 7 // 検索結果を格納するための配列を用意 8 searchResult = []; 9 // 検索結果エリアの表示を空にする 10 $('#search-result__list').empty(); 11 $('.search-result__hit-num').empty(); 12 // 検索ボックスに値が入ってる場合 13 if (searchText != '') { 14 $('.target-area p').each(function (ele) { 15 targetText = $(this).text(); 16 // 検索対象となるリストに入力された文字列が存在するかどうかを判断 17 if (targetText.indexOf(searchText) != -1) { 18 // 存在する場合はそのリストのテキストを用意した配列に格納 19 searchResult.push(targetText); 20 } 21 }); 22 // 検索結果をページに出力 23 for (var i = 0; i < searchResult.length; i++) { 24 $('<p>').text(searchResult[i]).appendTo('#search-result__list'); 25 } 26 // ヒットの件数をページに出力 27 hitNum = '<span class="marker1"><span>Result</span>:' + searchResult.length + ' titles</spna>'; 28 $('.search-result__hit-num').append(hitNum); 29 } 30 }; 31 var i = 1; 32 $('.target-area.al p').each(function () { 33 if (i < 10) { 34 $(this).attr('data-num', '0' + i); 35 } else { 36 $(this).attr('data-num', i); 37 } 38 i++; 39 }); 40 $('.target-area p').each(function (i,ele) { 41 $(ele).wrapInner('<span></span>'); 42 if( i+1 < 10 ) { 43 var num = $('<span>').attr("class","num").text('0'+(i+1)); 44 } else { 45 var num = $('<span>').attr("class","num").text(i+1); 46 } 47 $(ele).prepend(num); 48 }); 49 // searchWordの実行 50 $('#search-text').on('input', searchWord); 51 $('#search-text').on('input', function (e) { 52 var v = $(this).val(); 53 $('.target-area p').each(function (i,ele) { 54 var txt = $(ele).text(); 55 if (v !== "") txt = txt.replace(RegExp(v, 'g'), function (m) { 56 return '<span class="marker1">' + m + '</span>' 57 }); 58 }); 59 $('#search-result__list p').each(function (i,em) { 60 var data = $(em).text(); 61 var slice = data.slice( 0, 5 ); 62 var res = slice.replace(/[^0-9]/g, ''); 63 if (res !== "") data = data.replace(RegExp(res, 'g'), function (m) { 64 return '<span class="num">' + m + '</span>' 65 }); 66 }); 67 });

html

1<div class="search-area"> 2 <form> 3 <input type="text" id="search-text" placeholder="keyword search"> 4 </form> 5 <div class="search-result"> 6 <div class="search-result__hit-num"></div> 7 <div id="search-result__list"></div> 8 </div> 9</div> 10<div class="target-area title"> 11 <p>あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。</p> 12 <p>あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。</p> 13 <p>あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。</p> 14</div>

css

1.title .num, #search-result__list p .num { 2 position: absolute; 3 counter-increment: cnt; 4 content: counter(cnt, decimal-leading-zero); 5 margin-left: -2.5rem; 6 padding: 0; 7 color: var(--text); 8} 9.title p, #search-result__list p { 10 margin-left: 4rem 11} 12.title p .num, #search-result__list p .num { 13 margin-left: -3rem 14}

試したこと

js

1// searchWordの実行 2 $('#search-text').on('input', searchWord); 3 $('#search-text').on('input', function (e) { 4 var v = $(this).val(); 5 $('.target-area p').each(function (i,ele) { 6 var txt = $(ele).text(); 7 if (v !== "") txt = txt.replace(RegExp(v, 'g'), function (m) { 8 return '<span class="marker1">' + m + '</span>' 9 }); 10 }); 11 $('#search-result__list p').each(function (i,em) { 12 var data = $(em).text(); 13 var slice = data.slice( 0, 5 ); 14 var res = slice.replace(/[^0-9]/g, ''); 15 if (res !== "") data = data.replace(RegExp(res, 'g'), function (m) { 16 return '<span class="num">' + m + '</span>' 17 }); 18 });

こちら、エラーないのに、どちらのコードも機能しません。なぜ?

補足情報(FW/ツールのバージョンなど)

Firefox 最新
Safari 604.1

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

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

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

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

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

guest

回答2

0

ベストアンサー

せっかくeachメソッドにインデックスがあるので、それを取得したらいいのではないでしょうか?

js

1 $('.target-area p').each(function (i,ele) { 2 let txt = $(ele).text(); 3 let num = $('<span>').attr("class","marker1").text(i+1); 4 let ptag = $(ele).text(txt).prepend(num); 5 $('#search-result__list').append(ptag); 6 });

大事なポイントは先にtextメソッドで文字列だけ代入して、後でprependメソッドで<span>タグを代入します。これの順番が逆だと、あとのtextメソッドだけが有効になってしまい、番号を振ることができません。

こうなっていることを確認できました。

<p> <span class="marker1">1</span> "あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。" </p>

投稿2021/06/02 10:15

編集2021/06/03 08:45
FKM

総合スコア3644

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

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

erp

2021/06/03 06:40

ありがとうございます。結果の方にも数字を反映させることができました。 しかし、結果に出力された<p>の内容が、<p>112あのイーハトーヴォの</p> のように、数字と内容が一続きになってしまうのですが、どうすれば数字を<span>で囲めますか?
FKM

2021/06/03 06:46 編集

数字だけをspanで囲みたいのならば、wrapInnerの部分は不要です。ブラウザの開発画面で確認してもらえばいいですが、数値だけが<span>で囲まれている状態になっていますよ。
erp

2021/06/03 06:48

すみません、target-area の出力は今のままでいいのです。 #search-result__list に出力された結果が <p>01内容</p>みたいになってしまうことです。
FKM

2021/06/03 08:33

修正しました。これでどうでしょうか?
erp

2021/06/03 09:34

ありがとうございます。 大変恐縮なのですが、#search-result__list の p は検索した文字列に一致た文字を含む文で、上げていただいた方法だと検索の結果が反映されません。 そこで、試したことにあるように、#search-result__list p の文頭の数字だけを取り出してみました(res)。しかし、その下の if での置換が上手くできませんでした。 #search-result__list p内の取り出した文字列(res)を <span> で囲むにはどうすればいいのでしょうか。 度々本当にすみません。
FKM

2021/06/03 10:44

文字列は文字列でspanタグで囲みたいなら、最初に告げた通りに let elem = $(ele).wrapInner('<span>'); これで対応できませんかね。
erp

2021/06/03 11:15

それはどちらでもいいです。 if (searchText != '') {} 内で検索結果を出力しているのが、上記の方法だと反映されない点についてです。 ともあれ、最初の質問から随分離れてしまったので、新しく質問を立てました。 右も左も分からないところをお助けいただきありがとうございました。
guest

0

$(this).text()

こちらで取得できるのはtextContentです。文字列。

対してparent()はあくまで「対象の要素の親」を取得しようとします。

文字列に対してparent()はあてられないので今回の現象が起きています。

pに対してdata-numつけてるなら単純に下記で良いのでは。

js

1console.log( $(this).data('num') );

あと、thisが渋滞しているので整理したほうがいいかもしれません。

※未検証

js

1 $('#search-text').on('input', function (e) { 2 var v = $(e.currentTarget).val(); 3 $('.target-area p').each(function (i,ele) { 4 var txt = $(ele).text(); 5console.log( $(ele).data('num') ); 6 //~~~中略 7 8 }); 9 }); 10 11

投稿2021/05/25 12:38

m.ts10806

総合スコア80854

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

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

erp

2021/05/25 13:38

簡略化ありがとうございます。直してみました。 しかし提示していただいた式だと、検索でふるいにかけた文だけではなく、すべての文のdata-をコンソールに示すので、目的に適わなくなってしまうのかなと思いました。
m.ts10806

2021/05/25 13:51

コード内のコメントに書いた通り、中略してるのであとは補完してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問