javascript - ajax 实时搜索添加按键向下功能
问题描述
我想让实时搜索框像 google 一样,我已经实现 jquery ajax 到后端以获取结果,但是我想在用户按下按键时启用我想像 google 一样向 ajax 返回建议添加一个类,当当用户按下回车键时,用户按下建议高亮将转到一个位置,它将转到 href。以下是我的 ajax 返回 html 代码:
<ul id="suggestion" style="list-style-type: none;">
<li><a class="suggestion-link" href="http://eled.test/post/sunt-iure-nihil-deleniti-rerum"> Sunt Iure Nihil Deleniti Rerum.</a>
</li>
<li><a class="suggestion-link" href="http://eled.test/post/porro-et-numquam-nihil-nesciunt-nesciunt"> Porro Et Numquam Nihil Nesciunt Nesciunt.</a>
</li>
<li><a class="suggestion-link" href="http://eled.test/post/my-new-post-yeah"> My New Post Yeah !!</a> </li>
<li><a class="suggestion-link" href="http://eled.test/post/rerum-voluptatem-fuga-excepturi-provident-et-distinctio"> Rerum Voluptatem Fuga Excepturi Provident Et...</a>
</li>
</ul>
下面是我的搜索表格
<form method="GET" action="{{route('home.search')}}" class="search-form" id="search-form" >
<div class="form-group">
<input type="text" name="keyword" id="search-input" placeholder="What are you looking for?" autocomplete="off">
<button type="submit" class="submit"><i class="fas fa-search"></i></button>
</div>
<ul id="suggestion" style="display: none;list-style-type: none; "></ul>
</form>
下面是我的ajax
$(document).ready(function() {
//sidebar search function ajax
$("#search-input").keyup(function() {
var keyword = $('#search-input').val();
var url = "{{route('home.ajax_search')}}";
if (keyword == "") {
$("#suggestion").html("");
$('#suggestion').hide();
}else {
$.ajax({
type: "GET",
url: url ,
data: {
keyword: keyword
},
success: function(data) {
$("#suggestion").html(data).show();
//console.log(data);
$('#search-input').on("keydown", function (e) {
var listItems = $('.suggestion-link');
switch(e.which) {
case 38:
console.log('up');
break;
case 40:
listItems.addClass('selected');
console.log('down');
break;
default: return;
}
});
}
});
}
});
});
在 ajax 内部,当我尝试按下和向上键时,我可以让控制台日志工作。38 / 40,但我无法将所选类添加到我遵循的 li 元素添加 keydown(键盘箭头向上/向下)支持 AJAX Live Search PHP 问题是我无法将活动类应用于返回元素,因此用户不会知道密钥向下/向上工作谢谢
解决方案
首先,当你渲染结果时,给每个 li 元素一个 ID。ID 可以是循环的索引。只需确保 ID 是连续的。然后你可以使用类似的东西:
let highlighted = 0;
$('#search-input').on('keydown', function(e) {
//check if pressed key is down or up
// 40 is a code for down arrow, 38 for up
if([38, 40].indexOf(e.which) < 0)
return;
//remove highlighted class from all list elements here
$('#suggestion').find('li.highligted').removeClass('highligted');
//handle down and up keypress here
hightlighted = e.which == 40 ? highlighted + 1 : highligted - 1;
$('#suggestion-'+highlighted).addClass('highligted');
});
推荐阅读
- linux - 在 Linux 中安装 Vmware 服务器
- c++ - 运行函数 GetVolumeInformation() 时我得到非常随机的结果
- php - 与您的 MariaDB 服务器版本相对应的正确语法的手册错误
- c# - 当我开始拖动时,我的可拖动对象变得不可见
- python - How to convert sequence of ply files to .fbx animation
- c++ - Can I learn the Win32 API without C++ (with only C)?
- php - My database connection doesn't connect with postgreSQL
- python - How do i add path in python docx?
- python - 当我的脚本导入模块 pikepdf 和 pdfminer3 时,如何修复 pyinstaller 'no module named...' 错误?
- html - Flex item's auto margin cuts parent's padding