Jquery Bootstrap Accordian Часто задаваемые вопросы Поиск

Я работаю над довольно большой страницей часто задаваемых вопросов, на которой должно быть несколько разделов. Ему нужна эффективная функция поиска, и я собрал ее на основе предыдущего ответа, но я м застрял на пару пунктов.

  1. Функция поиска не работает - похоже, не выбран правильный 'panelContainerId'
  2. Как объединить несколько идентификаторов аккордеона в функцию поиска
  3. Как выделить поисковый запрос в результатах

Вот мои рабочие коды - см. ниже также здесь https://jsfiddle.net/clappertrapp/92vxzes7/71/

jQuery(document).ready(function ($) {
  
// This section makes the search work.
(function() {
  var searchTerm, panelContainerId;
  $('#accordion_search_bar').on('change keyup', function() {
    searchTerm = $(this).val();
    //console.log( $(this).val() );
    $('#accordionname1 > .panel, #accordionname2 > .panel').each(function() { // is this the right way to add multiple sections? 
      panelContainerId = '#' + $(this).attr('id'); // << should be collapse10 or 11 etc, but not getting it
      
      //console.log(  $(this).attr('id')  );
      

      // Makes search to be case insesitive 
      $.extend($.expr[':'], {
        'contains': function(elem, i, match, array) {
          return (elem.textContent || elem.innerText || '').toLowerCase()
            .indexOf((match[3] || "").toLowerCase()) >= 0;
        }
      });

      // END case insesitive

      // Show and Hide Triggers
      $(panelContainerId + ':not(:contains(' + searchTerm + '))').hide(); //Hide the rows that done contain the search query.
      $(panelContainerId + ':contains(' + searchTerm + ')').show().css({"background-color":"red"}); //Show the rows that contain answer - highlight with red!

    });
  });
}());
// End Show and Hide Triggers


// END 
});
//colors
//$grey: #cacaca;

// main
#page_container {
  margin-top: 15px;
  margin-bottom: 15px;
}

// search input
#accordion_search_bar_container {
  position: relative;
  &:after { 
    content: '\e003';
    font-family: Glyphicons Halflings;
    width: 18px;
    height: 18px;
    position: absolute;
    right: 10px;
    bottom: 10px; 
    margin:20px;
  }  
  #accordion_search_bar {
    display: block;
    margin: 20px auto;
    width: 100%;
    padding: 27px 10px;
    border: 1px solid $grey;
    border-radius: 25px;
    outline: 0;
  }
}

// make all the line clickable
.panel-title { 
  a {
    display: block;
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<div class="container" id="page_container">
  
  <div id="accordion_search_bar_container">
    <input type="search" id="accordion_search_bar" placeholder="Search" />
    <input type="button" id="accordion_search" value="Search in FAQs">
  </div>

  <h2 id="one">Section one - What is being amazed?</h2>
  <div class="panel-group" id="accordionname1">
   
   
    <div class="panel panel-default panel-even">
      <div class="panel-heading">
        <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordionname1" href="#collapse10">
          <h5><i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i>Tell me all about being amazed?</h5>
        </a>
      </div>
      <div id="collapse10" class="panel-collapse collapse ">
        <div class="panel-body postclass">
          <p>Doing amazing things is amazing</p>
        </div>
      </div>
    </div>

    <div class="panel panel-default panel-odd">
      <div class="panel-heading">
        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordionname1" href="#collapse11">
          <h5>
            <i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i>
            What's so great about being amazed?</h5>
        </a></div>
      <div id="collapse11" class="panel-collapse collapse ">
        <div class="panel-body postclass">
          <p>You have to trust that it is amazing!</p>
        </div>
      </div>
    </div>

</div>

<h2 id="two">Section two - How to be amazed</h2>
  <div class="panel-group" id="accordionname2">
  
    <div class="panel panel-default panel-even">
      <div class="panel-heading">
        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordionname2" href="#collapse10">
          <h5><i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i>Where do I sign up to become amazed?</h5>
        </a>
      </div>
      <div id="collapse10" class="panel-collapse collapse ">
        <div class="panel-body postclass">
          <p>You sign up at the Be Amazed sign up page</p>
        </div>
      </div>
    </div>
    
    <div class="panel panel-default panel-odd">
      <div class="panel-heading">
        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordionname2" href="#collapse11">
          <h5>
            <i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i>
            What happens once I am sign up to be amazed?</h5>
        </a></div>
      <div id="collapse11" class="panel-collapse collapse ">
        <div class="panel-body postclass">
          <p>Once you've signed up, we'll be in touch to amaze you.</p>
        </div>
      </div>
    </div>

</div>

<h2 id="three">Section three - Refunds</h2>
  <div class="panel-group" id="accordionname3">  
     
    <div class="panel panel-default panel-even">
      <div class="panel-heading">
        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordionname3" href="#collapse10">
          <h5><i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i>I wasn't amazed - can I get a refund?</h5>
        </a>
      </div>
      <div id="collapse10" class="panel-collapse collapse ">
        <div class="panel-body postclass">
          <p>Well that's too bad, we did try to amaze you, but what we thought was amazing, you didn't. so we will give you an amazing credit.</p>
        </div>
      </div>
    </div>

    <div class="panel panel-default panel-odd">
      <div class="panel-heading">
        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordionname3" href="#collapse11">
          <h5>
            <i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i>
            What can I do with the credit?</h5>
        </a></div>
      <div id="collapse11" class="panel-collapse collapse ">
        <div class="panel-body postclass">

          <p>Well, it's amazing because it's useless of course!</p>
        </div>
      </div>
    </div>


</div>
</div>


person SolaceBeforeDawn    schedule 25.08.2020    source источник
comment
вам нужно добавить bgcolor к panelContainerId, где совпадает текст поиска или panel-body?   -  person Swati    schedule 31.08.2020
comment
Я не знаю, что вы имеете в виду, можете уточнить? Или, может быть, покажите мне в jsfiddle выше?   -  person SolaceBeforeDawn    schedule 01.09.2020
comment
Что-то вроде этой скрипки.   -  person Swati    schedule 01.09.2020
comment
Ах, да, я понимаю, что вы имеете в виду. Это хорошо, спасибо. Тем не менее, функциональность все еще не соответствует ожиданиям. Например, если вы ищете слово «удивляться», оно должно отображаться в нескольких местах, но цвет фона показывает только один результат.   -  person SolaceBeforeDawn    schedule 02.09.2020
comment
нет его отображения в нескольких местах, перепроверьте эту скрипку   -  person Swati    schedule 02.09.2020
comment
ОК, да, теперь кажется, что есть, но нужно скрыть строки, которые не содержат поисковый запрос - строка скрипта 23 не работает: $(panelContainerId + ':not(:contains(' + searchTerm + '))' ).Спрятать(); - Любые идеи?   -  person SolaceBeforeDawn    schedule 03.09.2020
comment
Привет, извините за поздний ответ. Вот еще одна рабочая скрипта   -  person Swati    schedule 03.09.2020
comment
Привет, Свати Еще раз спасибо за вашу помощь, все еще есть проблема ... Если я выбираю поисковый запрос, например, кредит, он выделяет правильную панель, но мне нужно скрыть все на странице, кроме панели (или панелей, если их больше одного) с ответом . Также нужна кнопка сброса, чтобы вернуться в нормальное состояние.....   -  person SolaceBeforeDawn    schedule 04.09.2020
comment
Я добавил сброс, но мне нужна помощь, чтобы завершить это... немного глючит! jsfiddle.net/clappertrapp/bhz437up/10   -  person SolaceBeforeDawn    schedule 04.09.2020


Ответы (1)


Поскольку здесь вам нужно скрыть всю панель, вы можете использовать класс panel-default. Сначала скройте все divs с этим именем класса, а затем используйте :contains, чтобы проверить, есть ли на панели searchTerm, который ищет пользователь или нет, в зависимости от этого добавьте css к этой конкретной панели Только .

Затем для кнопки сброса используйте $(".panel-group").find(".panel-default").show(), чтобы отобразить всю панель, которая скрыта при наборе текста, а также здесь вы меняете background-color на обычный или любой другой цвет.

Демонстрационный код :

jQuery(document).ready(function($) {

  // This section makes the search work.
  (function() {
    var searchTerm, panelContainerId;
    $('#accordion_search_bar').on('change keyup', function() {
      searchTerm = $(this).val();
      var collapse = $(".panel-group");
      if ($(this).val() != "") {
  //find panel default hide them
        collapse.find(".panel-default").hide(); //hide all li 
//loop through panel group
        $('.panel-group').each(function() {
        //check if matches
          collapse.find('.panel-collapse:contains(' + searchTerm + ')').parent().show().css({
            "background-color": "red"
          });

        });
      } else {
         
        collapse.find(".panel-default").show().css({
          "background-color": ""
        });; //show all and remove red bg 
      }
    });

  }());


  $('#resetbtn').click(function() {
    $('#accordion_search_bar').val("");
    $(".panel-group").find(".panel-default").show().css({
      "background-color": ""
    });//show all remove red bg

  });

});
// main
#page_container {
  margin-top: 15px;
  margin-bottom: 15px;
}

// search input
#accordion_search_bar_container {
  position: relative;
  &:after {
    content: '\e003';
    font-family: Glyphicons Halflings;
    width: 18px;
    height: 18px;
    position: absolute;
    right: 10px;
    bottom: 10px;
    margin: 20px;
  }
  #accordion_search_bar {
    display: block;
    margin: 20px auto;
    width: 100%;
    padding: 27px 10px;
    border: 1px solid $grey;
    border-radius: 25px;
    outline: 0;
  }
}

// make all the line clickable
.panel-title./colors //$grey: #cacaca;
// main
#page_container {
  margin-top: 15px;
  margin-bottom: 15px;
}

// search input
#accordion_search_bar_container {
  position: relative;
  &:after {
    content: '\e003';
    font-family: Glyphicons Halflings;
    width: 18px;
    height: 18px;
    position: absolute;
    right: 10px;
    bottom: 10px;
    margin: 20px;
  }
  #accordion_search_bar {
    display: block;
    margin: 20px auto;
    width: 100%;
    padding: 27px 10px;
    border: 1px solid $grey;
    border-radius: 25px;
    outline: 0;
  }
}

// make all the line clickable
.panel-title a {
  display: block;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<div class="container" id="page_container">

  <div id="accordion_search_bar_container">
    <input type="search" id="accordion_search_bar" placeholder="Search" />
    <input type="button" id="accordion_search" value="Search in FAQs">
    <input type="button" id="resetbtn" value="Reset">


  </div>
  <h2 id="one">Section one - What is being amazed?</h2>
  <div class="panel-group" id="accordionname1">
    <div class="panel panel-default panel-even">
      <div class="panel-heading">
        <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordionname1" href="#collapse10">
          <h5><i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i>Tell me all about being amazed?</h5>
        </a>
      </div>
      <div id="collapse10" class="panel-collapse collapse ">
        <div class="panel-body postclass">
          <p>Doing amazing things is amazing</p>
        </div>
      </div>
    </div>

    <div class="panel panel-default panel-odd">
      <div class="panel-heading">
        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordionname1" href="#collapse11">
          <h5>
            <i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i> What's so great about being amazed?</h5>
        </a>
      </div>
      <div id="collapse11" class="panel-collapse collapse ">
        <div class="panel-body postclass">
          <p>You have to trust that it is amazing!</p>
        </div>
      </div>
    </div>

  </div>

  <h2 id="two">Section two - How to be amazed</h2>
  <div class="panel-group" id="accordionname2">

    <div class="panel panel-default panel-even">
      <div class="panel-heading">
        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordionname2" href="#collapse12">
          <h5><i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i>Where do I sign up to become amazed?</h5>
        </a>
      </div>
      <div id="collapse12" class="panel-collapse collapse ">
        <div class="panel-body postclass">
          <p>You sign up at the Be Amazed sign up page</p>
        </div>
      </div>
    </div>

    <div class="panel panel-default panel-odd">
      <div class="panel-heading">
        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordionname2" href="#collapse13">
          <h5>
            <i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i> What happens once I am sign up to be amazed?</h5>
        </a>
      </div>
      <div id="collapse13" class="panel-collapse collapse ">
        <div class="panel-body postclass">
          <p>Once you've signed up, we'll be in touch to amaze you.</p>
        </div>
      </div>
    </div>

  </div>

  <h2 id="three">Section three - Refunds</h2>
  <div class="panel-group" id="accordionname3">

    <div class="panel panel-default panel-even">
      <div class="panel-heading">
        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordionname3" href="#collapse14">
          <h5><i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i>I wasn't amazed - can I get a refund?</h5>
        </a>
      </div>
      <div id="collapse14" class="panel-collapse collapse ">
        <div class="panel-body postclass">
          <p>Well that's too bad, we did try to amaze you, but what we thought was amazing, you didn't. so we will give you an amazing credit.</p>
        </div>
      </div>
    </div>

    <div class="panel panel-default panel-odd">
      <div class="panel-heading">
        <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordionname3" href="#collapse15">
          <h5>
            <i class="icon-minus primary-color"></i>
            <i class="icon-plus"></i> What can I do with the credit?</h5>
        </a>
      </div>
      <div id="collapse15" class="panel-collapse collapse ">
        <div class="panel-body postclass">

          <p>Well, it's amazing because it's useless of course!</p>
        </div>
      </div>
    </div>


  </div>
</div>

person Swati    schedule 04.09.2020
comment
Спасибо @Swati, это потрясающе. Некоторые незначительные правки, и это будет правильно: 1) как сделать так, чтобы поиск игнорировал регистр текста - чтобы он находил все слова независимо от заглавных букв и т. д. 2) можно ли выделить фактический поисковый запрос, например. что-то вроде ‹mark› - не красный абзац 3) И как сделать так, чтобы можно было искать и в .panel-heading? Я пробовал здесь: jsfiddle.net/clappertrapp/kL7jyd3q - person SolaceBeforeDawn; 08.09.2020
comment
Привет, это стало сложнее, было бы хорошо, если бы вы задали другой вопрос, чтобы больше людей могли вам помочь :) - person Swati; 09.09.2020
comment
В самом деле? Мы так близко здесь - и вопрос по теме.... :-) ну, в любом случае спасибо. Я открою новый - person SolaceBeforeDawn; 10.09.2020
comment
вот еще вопрос, еще раз спасибо:-) > stackoverflow.com/questions/63838341/ - person SolaceBeforeDawn; 11.09.2020