Я пытаюсь написать скрипт, который выделяет на веб-странице все, что соответствует вводу в поле поиска, игнорируя регистр при поиске совпадений.
Моя HTML-страница выглядит как -
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Index Page</title>
<!--<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">-->
<!-- Bootstrap core CSS -->
<link href="Content/bootstrap.min.css" rel="stylesheet">
<!-- Your custom styles (optional) -->
<link href="Content/style.css" rel="stylesheet">
<!-- custom javascript -->
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.quicksearch/2.3.1/jquery.quicksearch.js"></script>
<script src="Scripts/script.js"></script>
</head>
<body>
<!--Main Navigation-->
<header>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" id="txt_query" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</nav>
</header>
<!--Main Navigation-->
<div class="container-fluid">
<div class="searchable">
Hello
<div>
test1
</div>
<div>
test2
</div>
<div>
Test3
<div>
teest4
</div>
</div>
</div>
</div>
</body>
</html>
А код javascript (JQuery) -
$(function () {
$('input#txt_query').on('input', function () {
if (this.value !== null) {
var search_value = this.value;
var search_regexp;
if (this.value !== "") {
search_regexp = new RegExp(search_value + "+(?![^<]*\>)", "gi");
}
$('.searchable').each(function () {
$(this).find('*').each(function () {
if ($(this).data('old-state') == null) {
$(this).data('old-state', $(this).html());
}
if (this.value !== "") {
var html = $(this).data('old-state').replace(search_regexp, "<span class = 'highlight'>" + search_value + "</span>");
//alert(html);
$(this).html(html);
}
});
});
}
});
});
И CSS для выделения слова -
.highlight {
font-weight: bold;
color: green;
}
В настоящее время есть 2 проблемы.
Там, где совпадающие термины являются смежными, элементы рассматриваются как один элемент. Таким образом, при поиске «e» «ee» заменяется подсвеченным «e».
Поиск 't' находит заглавную 'T', но заменяет ее выделенным 't' (маленькая t).
Я думаю, что обе проблемы могут быть решены путем изменения следующей строки кода:
var html = $(this).data('old-state').replace(
search_regexp,
"<span class = 'highlight'>" + search_value + "</span>"
);
Вместо 'search_value' я хотел бы использовать текст, найденный шаблоном регулярных выражений, но я не знаю, как получить к нему доступ.