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

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

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

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

Q&A

1回答

3035閲覧

javascriptで検索機能を実装したのですが、上手く機能しません。

drizzing20

総合スコア363

JavaScript

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

1グッド

1クリップ

投稿2016/11/09 16:44

編集2016/11/10 14:19

https://jsfiddle.net/MrTK1230/71vuuvo1/

上記のサイトで作業をしています

検索したら対象文字がハイライトされ、別の単語を検索したら今のハイライトを削除して検索対象文字にハイライトを付加するというコードを書きたいのですが、
消えるときときえないときがでてしまいます。
原因がわかりません。わかる方お願いします

HTML

1<form class="form" method="POST" name="form1"><input class="textarea" name="word" type="text" /> 2<input type="submit" value="検索" /></form></div> 3<div class="thread"> 4<div class="high"> 5<ul> 6<li> 7aaa 8</li> 9<li> 10aaa111 11</li> 12</ul>

JavaScript

1jQuery(document).ready(function($) { 2 var $thread = $(".high"); 3 var $form = $(".form:first"); 4 var $input = $(".textarea:first"); 5 var $lis = $thread.find("> ul > li"); 6 7 $form.on("submit", function(e){ 8 var liArr = []; 9 e.preventDefault(); 10 $lis.each(function(){ 11 liArr.push($(this).text().toLowerCase()); 12 $item = $(this); 13 $item.html($item.html().replace(/<span class="highlight">([^<]+)<\/span>/gi, '$1')); 14 }); 15 var searchWord = $.trim($input.val()).toLowerCase(); 16 17 //ひらがなをカタカナでも検索可能 18 searchWordkata = searchWord.replace(/[ぁ-ん]/g, function(s) { 19 return String.fromCharCode(s.charCodeAt(0) + 0x60); 20 }); 21 //カタカナをひらがなでも検索可能 22 searchWordkana = searchWord.replace(/[ァ-ン]/g, function(s) { 23 return String.fromCharCode(s.charCodeAt(0) - 0x60); 24 }); 25 26 if(searchWord.length){ 27 for(var li in liArr){ 28 $item = $lis.eq(li); 29 if( liArr[li].indexOf(searchWordkata) != -1 || liArr[li].indexOf(searchWordkana) != -1){ 30 //カタカナでもひらがなでもヒットするように2つ必要 31 $item.removeClass("is-hidden").html($item.html().replace(new RegExp(searchWordkana+"(?!([^<]+)?>)", "gi"), '<span class="highlight">$&</span>')); 32 $item.removeClass("is-hidden").html($item.html().replace(new RegExp(searchWordkata+"(?!([^<]+)?>)", "gi"), '<span class="highlight">$&</span>')); 33 } 34 } 35 $("html,body").animate({scrollTop:$(".highlight").offset().top}); 36 } 37 }); 38}); 39

CSS

1/* highloght */ 2.thread p{ 3 line-height: 1.6; 4} 5.high .highlight{ 6 background-color: #fffd77; 7}

改善後

JavaScript

1jQuery(document).ready(function($) { 2 var $thread = $(".high"); 3 var $form = $(".form:first"); 4 var $input = $(".textarea:first"); 5 var $lis = $thread.find("> ul > li"); 6 7 $form.on("submit", function(e){ 8 var liArr = []; 9 e.preventDefault(); 10 $lis.each(function(){ 11 liArr.push($(this).text().toLowerCase()); 12 $item = $(this); 13 $item.html($item.html().replace(/<span class="highlight">([^<]+)<\/span>/gi, '$1')); 14 }); 15 var searchWord = $.trim($input.val()).toLowerCase(); 16 17 //ひらがなをカタカナでも検索可能 18 searchWordkata = searchWord.replace(/[ぁ-ん]/g, function(s) { 19 return String.fromCharCode(s.charCodeAt(0) + 0x60); 20 }); 21 //カタカナをひらがなでも検索可能 22 searchWordkana = searchWord.replace(/[ァ-ン]/g, function(s) { 23 return String.fromCharCode(s.charCodeAt(0) - 0x60); 24 }); 25 26 if(searchWord.length){ 27 for(var li in liArr){ 28 $item = $lis.eq(li); 29 if( liArr[li].indexOf(searchWordkata) != -1 || liArr[li].indexOf(searchWordkana) != -1 || liArr[li].indexOf(searchWord) != -1){ 30 //カタカナでもひらがなでもヒットするように2つ必要 31 $item.removeClass("is-hidden").html($item.html().replace(new RegExp(searchWordkana+"(?!([^<]+)?>)", "gi"), '<span class="highlight">$&</span>')); 32 $item.removeClass("is-hidden").html($item.html().replace(new RegExp(searchWordkata+"(?!([^<]+)?>)", "gi"), '<span class="highlight">$&</span>')); 33 $item.removeClass("is-hidden").html($item.html().replace(new RegExp(searchWord+"(?!([^<]+)?>)", "gi"), '<span class="highlight">$&</span>')); 34 } 35 } 36 $("html,body").animate({scrollTop:$(".highlight").offset().top}); 37 } 38 }); 39}); 40</script>
DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

//カタカナでもひらがなでもヒットするように2つ必要

としているところで英数字などカタカナでもひらがなでもないものを排除していないので、「aaa」で1回検索すると下記のようになります。で、replaceで消すのが1つずつになるため当然1個余分に残ります。

HTML

1<span class="highlight"><span class="highlight">aaa</span></span>

投稿2016/11/09 17:07

kei344

総合スコア69407

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

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

drizzing20

2016/11/10 14:20

回答ありがとうございます。回答をもとに修正したつもりなのですが、上手く行きませんでした。もう少し教えていただいてもよろしいでしょうか
kei344

2016/11/10 18:07

<span class="highlight"><span class="highlight"><span class="highlight"><span class="highlight">aaa</span></span></span></span> 次は三つに増えましたね。 searchWordkata = searchWord.replace(/*略*/); searchWordkana = searchWord.replace(/*略*/); は searchWord === searchWordkata === searchWordkana になることがあります。(むしろ成らない事のほうが限定的) 例えば「aaa」と入れた場合、 $item.removeClass("is-hidden").html($item.html().replace(new RegExp('aaa'+"(?!([^<]+)?>)", "gi"), '<span class="highlight">$&</span>')); $item.removeClass("is-hidden").html($item.html().replace(new RegExp('aaa'+"(?!([^<]+)?>)", "gi"), '<span class="highlight">$&</span>')); $item.removeClass("is-hidden").html($item.html().replace(new RegExp('aaa'+"(?!([^<]+)?>)", "gi"), '<span class="highlight">$&</span>')); と3回繰り返すことになります。 「is-hiddenのクラスを持つ要素に囲まれていない」という条件を正規表現でがんばるか、 /* 置換処理1回目 */ if ( searchWordkata !== searchWordkana ) {/* 置換処理2回目 */} とかする感じでしょうか。 また、下記で消していますが、 $item.html($item.html().replace(/<span class="highlight">([^<]+)<\/span>/gi, '$1')); highlightが出てくる間繰り返し置換することで「残ってしまう」事は回避出来ます。(二重にしなければその処理は必要ないのでかなり対処療法)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問