Скрыть результаты поиска при нажатии в любом месте, ожидая результатов поиска в Jquery

Я пытаюсь создать панель поиска в стиле Gmail. В основном панель поиска, которая позволяет пользователю вводить результат поиска и отображать результат во всплывающем окне. См. изображение ниже.

Скрыть результаты поиска при нажатии в любом месте, ожидая результатов поиска в Jquery

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

Ниже представлен дизайн и структура мероприятия, которые я придумал.

<div onfocusout = "return HideSearchResultBox(this,event);">
<input type = "text" id = "MainPageSearchBar" placeholder = "Search here..." oninput = "return DisplaySearchResult();" onfocus = "return DisplaySearchResultBox();"/>
 <div class = "card searchresultcard" style = "width:100%">
 <div class = "card-body p-2" id = "searchResultDisplayDiv">
 </div>
 </div>
 </div>

Вот код, который я использовал для создания элементов результатов.

<div id = "SearchBarResult' + someID + '" onclick = "return OpenSearchResultTab(' + someID + ');">
<label> DisplayText <span class = "badge badge-pill badge-accent" style = "float:right">Member</span></label>
<label> SubText</label>
</div>

По сути, я пытаюсь скрыть div с результатами поиска, когда основной div (включая окно поиска и результаты) теряет фокус, что отлично работает.

Проблема в том, что когда я нажимаю на результаты поиска, событие "onfocusout" основного div (включая поле поиска и результаты) по-прежнему запускается. Итак, если я нажимаю на результат поиска, div закрывается, и событие клика результата поиска никогда не срабатывает.

Я попробовал несколько предложений от самого stackoverflow, которые я мог найти, например, перемещение события «onfocusout» в основной контейнер div или использование события mouseup. Но проблема остается прежней. Я пытался найти цель события, но каждый раз это было нулевым.

Редактировать: Я попытался удалить код, который скрывает результат поиска, и тогда событие щелчка для элементов результатов поиска работает нормально. Итак, если я скрою результат поиска, событие click не будет запущено.

Нажмите на редактор сниппетов [<>] и укажите минимальный воспроизводимый пример.

mplungjan 08.04.2019 07:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
811
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

  let flag=false;
//code of on over of search result item
function handleMouseOver(){
 flag=true
}
//code for mouse leave of search result item
function handleMouseLeave(){
 flag=false;
}
//you focus out event of search box
function hadleFocusOut(){
 if (flag){
  //do not hide search result,focus goes to search result item
  //allow user to select search result item
 }else{
  //hide search result
 }
}

Спасибо. Вот чего мне не хватало. Установка флага при наведении курсора — самый простой способ определить цель события.

jitendragarg 08.04.2019 09:14

Вам нужно проверить, не нажали ли вы за пределами области поиска.

$(document).on("click touchstart", function(e) {
  var t = $(e.target).closest('#SearchBoxContainer');
  var exceptDiv = $('#SearchBoxContainer');
  if (exceptDiv.is(t) == false) {
    //clicked oustide of div
    $('#searchResultDisplayDiv').hide();
  }
});

function DisplaySearchResultBox() {
  $('#searchResultDisplayDiv').show();
}

function doSomething() {
  alert('Do Something');
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<div id = "SearchBoxContainer">

  <input type = "text" onfocus = "DisplaySearchResultBox();">
  <div class = "" id = "searchResultDisplayDiv" style = "display: none;">
    <ul style = "background:#ccc">
      <li onclick = "doSomething()">This is search Result</li>
      <li onclick = "doSomething()">This is search Result</li>
      <li onclick = "doSomething()">This is search Result</li>
      <li onclick = "doSomething()">This is search Result</li>
      <li onclick = "doSomething()">This is search Result</li>
      <li onclick = "doSomething()">This is search Result</li>
      <li onclick = "doSomething()">This is search Result</li>
    </ul>
  </div>
</div>

В приведенном выше примере есть четкая инструкция для элемента поиска DOM, что после потери фокуса закрыть блок поиска. Необходимо изменить подход для достижения желаемого функционала.

Одним из способов может быть добавление обработчика событий в тело документа и проверка, не запускается ли событие щелчка не из результатов поиска, а затем закрытие контейнера поиска.

Надеюсь это поможет.

Другие вопросы по теме