Определение блока при поиске через RegExp

336
17 марта 2018, 16:50

var InputSort = $('input#sort'); 
var minlen = 2; 
 
InputSort.bind('keyup',function(){ 
    if(InputSort.val().length>=minlen) { 
        dosearch(); 
    } 
}); 
 
function dosearch() { 
    var term = InputSort.val(); 
    $('.light').each(function(){ 
        $(this).after($(this).html()).remove();   
    }); 
    t = ''; 
    $('.sorting li').each(function(){ 
        $(this).html($(this).html().replace(new RegExp(term, 'ig'), '<span class="light">$&</span>')); 
    }); 
};
ul {padding: 5px;} 
li {list-style: none; color: #333;} 
.light {color: #f00;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script> 
<input type="text" placeholder="Поиск" id="sort"> 
<ul class="sorting"> 
    <li>Яблоко</li> 
    <li>Апельсин</li> 
    <li>Лимон</li> 
    <li>Дыня</li> 
    <li>Арбуз</li> 
</ul>

В данный момент этот код ищет совпадения в словах и выделяет их.
Как реализовать, что выделение будет идти на <li>?

Answer 1

const InputSort = document.getElementById('sort'); 
const minlen = 2; 
 
InputSort.addEventListener('keyup', dosearch); 
 
function dosearch() { 
    const term = InputSort.value.toLowerCase(); 
    if(term.length < minlen) return true; 
    [...document.querySelectorAll('.sorting li')].forEach(li => { 
        if(li.innerText.toLowerCase().includes(term)) li.classList.add('light'); 
        else li.classList.remove('light'); 
    }); 
};
ul {padding: 5px;} 
li {list-style: none; color: #333;} 
.light {color: #f00;}
<input type="text" placeholder="Поиск" id="sort"> 
<ul class="sorting"> 
    <li>Яблоко</li> 
    <li>Апельсин</li> 
    <li>Лимон</li> 
    <li>Дыня</li> 
    <li>Арбуз</li> 
</ul>

Answer 2

Смотрите, вы используете код

$('.sorting li').each(function(){
    $(this).html($(this).html().replace(new RegExp(term, 'ig'), '<span class="light">$&</span>'));
});

для поиска элементов, а вызов $.each() - для обработки каждого, причем каждый - ListItem.

Чуть-чуть изменим этот код:

$('.sorting li').each(function(){
    if ($(this).html().test(new RegExp(term, 'ig'))) {
         // В тексте элемента списка есть то, что мы ищем,
         // значит просто помечаем этот элемент списка как выделенный
         // и идем пить пиво, потому что сегодня пятница
         $(this).addClass("light");
    }
});
READ ALSO
Определить почему 1 запрос делает лишним

Определить почему 1 запрос делает лишним

Не могу определить почему при отправке формы делается 2 запроса, если со второго раза отправляешь ту же форму, то получатся идет по одному...

194
Как определить что зажат ctrl при focusin?

Как определить что зажат ctrl при focusin?

Вот этот код не работает

219
Jquery не работает, где ошибка?

Jquery не работает, где ошибка?

Пытаюсь создать тестовый проект с использованием этой библиотеки, не работает в принципе, вот код индекса и скрипта:

246
Не могу вывести на форме данные через WHILE

Не могу вывести на форме данные через WHILE

Подключаю require("objectsphp"); - в в этой PHP-ке получаю данные из MYSQL

187