Build a Searchbar Using JavaScript in Five Steps

JavaScript 五个步骤制作搜寻功能

前言

解题

第一步:制作界面

先定义一个 <div>,并且在里面放置一个标题、一个搜索表单、一个用来放置搜索结果的列表。

<div>
<!-- 标题 -->
<h1>Book Finder</h1>
<!-- 搜索表单 -->
<form data-bookfinder-form>
<input name="search" type="text" placeholder="请输入搜索内容……" />
<button type="submit">提交</button>
</form>
<!-- 搜索结果 -->
<ul data-books></ul>
</div>

第二步:定义数据

先定义好一组数据,这里定义一个数组,里面包含许多书籍相关的对象。数据结构可以自行定义,无论是自己定义还是从第三方获取数据都可以。

const books = [
{
name: '双城记',
author: '狄更斯',
},
{
name: '童军警探',
author: '贝登堡',
},
{
name: '魔戒',
author: '约翰',
},
];

第三步:渲染数据到界面

有了数据后,可以专注于如何将现有数据展示到界面上。这里拆分为两个函数,一个用于「生成数据对应的 HTML」,另一个用于「将生成的 HTML 渲染到界面」。这样拆分能让代码更易于阅读、维护和测试。完成后界面上应该就可以看到前面定义的数据了!

function renderBooks(targetHTML) {
const bookList = document.querySelector('[data-books]');
bookList.innerHTML = targetHTML;
}
function generateBookHTML(targetBooks) {
return targetBooks
.map((book) => {
return `<li class="bookList__item">${book.name} - <span class="bookList__author">${book.author}</span></li>`;
})
.join('');
}

第四步:监听表单

前面定义了 data-bookfinder-form 这个属性,这里可以使用 querySelector 选择该元素,并监听其 submit 事件。当用户点击提交按钮时,就可以获取用户输入的值(e.target.search.value)。

document.querySelector('[data-bookfinder-form]').addEventListener('submit', (e) => {
e.preventDefault();
renderBooks(generateBookHTML(booksFilter(e.target.search.value)));
});

第五步:过滤函数

重点在于前面的 booksFilter 函数如何过滤数据。实际上很简单,只需要将表单提交的值与每条现有数据进行对比,如果匹配则返回该条数据,代码如下:

function booksFilter(targetBook, allBooks = books) {
return allBooks.filter((book) => {
return book.name.includes(targetBook);
});
}

结语

从这个简单的练习中,用 JavaScript 提供的现有方法达成一件常见的功能。以下是完整的程式码,可以在 CodePen 上面试试看:

See the Pen Book-Finder by Riceball ( @riecball) on CodePen.