前提・実現したいこと
リアルタイム検索で、ターゲットエリアの文章に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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/03 06:40
2021/06/03 06:46 編集
2021/06/03 06:48
2021/06/03 08:33
2021/06/03 09:34
2021/06/03 10:44
2021/06/03 11:15