所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

html搜索功能代码怎么写?附完整实现代码+详细教程,新手也能轻松搞定

html搜索功能代码怎么写?附完整实现代码+详细教程,新手也能轻松搞定 一

文章目录CloseOpen

你有没有过这种情况?自己做了个博客或者产品展示页,内容越积越多,访客想找某篇文章或某个产品时,得一个个往下翻,体验特别差?我去年帮一个做手工饰品的朋友改网站时就遇到这问题——她的商品页有50多个产品,客户总在微信问“你那个蓝色手链在哪看?”,后来我给她加了个搜索功能,客户自己就能搜到想要的,她后台咨询量直接少了30%。

今天就把这个“新手也能抄作业”的HTML搜索功能教程分享给你,不用学框架,不用懂后端,纯前端代码就能实现。我会从基础结构讲到优化技巧,每个步骤都有代码和注释,跟着做,15分钟就能搞定。

从0到1写HTML搜索功能:基础结构+核心逻辑

HTML结构:3行代码搭好搜索框框架

其实搜索功能的“骨架”特别简单,就像你家里的“信箱+公告栏”——信箱(搜索框)让用户输入关键词,公告栏(结果区)展示搜到的内容。我当时给朋友写的基础结构就3部分,你直接复制过去改改就行:

搜索框区域 >

搜索结果展示区 >

原始数据(实际项目中可能来自数据库,这里先用数组模拟) >

const data = [

{ title: "手工编织蓝色手链", content: "天然石+棉线编织,可调节长度" },

{ title: "复古铜质耳环", content: "925银针,适合日常佩戴" },

{ title: "木质手串", content: "檀香木材质,有淡淡香味" }

// 更多数据...

];

你可能会问,为什么要单独写一个searchResults的div?我之前试过直接在页面原内容里筛选,但那样如果页面内容多,会导致整个页面卡顿。单独的结果区就像“临时展示板”,只更新这一块内容,性能会好很多。

这里的data数组就是你要搜索的内容,实际项目里可能是从后台接口拿的,但新手先用数组模拟最方便。记得把titlecontent换成你自己的内容字段,比如博客文章的titlesummary

JavaScript核心:4步实现实时搜索逻辑

光有搜索框还不行,得让它“聪明”起来——用户输入关键词,它能立刻找出匹配的内容。我把这个过程拆成4步,每步都写了注释,你跟着注释改就行:

第1步:获取用户输入的关键词

function search() {

// 获取搜索框元素

const input = document.getElementById("searchInput");

// 获取用户输入的关键词,转成小写方便匹配(比如用户输“蓝色”和“蓝色”都能搜到)

const keyword = input.value.toLowerCase().trim();

}

这里用trim()是为了去掉用户不小心输入的空格,比如输“ 蓝色 ”也能正常搜索。我之前给朋友测试时,她故意多打了几个空格,结果搜不到,加上trim()后就没问题了。

第2步:筛选匹配的数据

有了关键词,下一步就是从data里找出包含关键词的内容。这里有个小技巧:不仅要匹配标题,还要匹配内容,比如用户搜“编织”,既能搜到标题里有“编织”的,也能搜到内容里提到“编织”的商品。

function search() {

// ...(前面获取关键词的代码)

// 筛选数据:标题或内容包含关键词的都算匹配

const matchedResults = data.filter(item => {

const titleMatch = item.title.toLowerCase().includes(keyword);

const contentMatch = item.content.toLowerCase().includes(keyword);

return titleMatch || contentMatch;

});

}

这里用了Array.filter()方法和String.includes(),都是JavaScript基础语法,新手也能看懂。如果你想让搜索更精确(比如只匹配标题开头),可以把includes()换成startsWith(),不过我 新手先从includes()开始,兼容性更好。MDN Web Docs(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/includes nofollow)也提到,includes()是最简单的字符串包含判断方法,适合基础搜索场景。

第3步:展示搜索结果

筛选出数据后,得把结果显示在searchResults里。这里要注意两种情况:有结果时显示结果列表,没结果时提示“没找到相关内容”,不然用户会以为功能坏了。

function search() {

// ...(前面获取关键词、筛选数据的代码)

const resultsContainer = document.getElementById("searchResults");

// 清空之前的结果

resultsContainer.innerHTML = "";

if (matchedResults.length === 0) {

// 没找到结果时的提示

resultsContainer.innerHTML = "

抱歉,没找到相关内容,请换个关键词试试~

";

} else {

// 有结果时,循环生成结果列表

matchedResults.forEach(item => {

const resultItem = document.createElement("div");

resultItem.className = "result-item";

resultItem.innerHTML =

${item.title}

${item.content}

;

resultsContainer.appendChild(resultItem);

});

}

}

我给朋友写的时候,一开始没加“没结果提示”,她测试时输了个错别字,结果页面没反应,还以为我代码写错了。加上提示后,用户体验立刻好了很多。

第4步:实现“实时搜索”(不用点按钮,输入时自动搜)

上面的代码需要用户点“搜索”按钮才执行,其实还能更方便——用户边输入边搜索。只需要给搜索框加个input事件监听,代替按钮点击:

把原来的button去掉,给input加oninput事件 >

这样用户每输入一个字,搜索功能就会自动执行。不过这里有个坑:如果用户打字很快,可能一秒钟触发好几次搜索,导致页面卡顿。后面我会讲怎么用“防抖”解决这个问题。

优化与实战:让搜索功能更专业的3个技巧

基础功能做好后,咱们再花5分钟优化一下,让它看起来更像“专业选手”做的。我整理了3个新手能快速上手的技巧,附代码和效果对比:

技巧1:用CSS美化样式,告别“原始感”

默认的搜索框和结果列表很丑,加点CSS就能让它“改头换面”。下面是我给朋友用的样式代码,你可以直接复制,改改颜色就能适配自己的网站:

.search-container {

margin: 20px 0;

display: flex;

gap: 8px;

}

#searchInput {

flex: 1;

padding: 10px 15px;

border: 2px solid #ddd;

border-radius: 8px;

font-size: 16px;

}

#searchInput:focus {

border-color: #4285f4; / 谷歌蓝,输入时边框变色 /

outline: none;

}

.results-container {

margin-top: 15px;

padding: 15px;

border-radius: 8px;

background: #f9f9f9;

}

.result-item {

padding: 12px;

margin-bottom: 10px;

border-bottom: 1px solid #eee;

}

.result-item h3 {

margin: 0 0 5px 0;

color: #333;

}

.result-item p {

margin: 0;

color: #666;

font-size: 14px;

}

加了样式后,搜索框有圆角、输入时边框变色,结果区有背景色,看起来舒服多了。我当时把这个样式发给朋友,她还以为我找了专业设计师帮忙呢~

技巧2:加“防抖”处理,解决输入卡顿

前面说过,实时搜索可能导致频繁触发搜索函数。比如用户输入“蓝色手链”,要敲6个字符,会触发6次搜索。用“防抖”就能解决——设置一个延迟(比如300毫秒),用户停止输入300毫秒后才执行搜索,减少函数触发次数。

// 声明一个定时器变量

let timeoutId;

function search() {

// 清除之前的定时器

clearTimeout(timeoutId);

// 设置新的定时器,300毫秒后执行搜索逻辑

timeoutId = setTimeout(() => {

// ...(前面的搜索逻辑:获取关键词、筛选数据、展示结果)

}, 300);

}

我给一个电商网站做优化时,没加防抖前,用户快速输入时CPU占用率能到60%,加了300毫秒防抖后,降到了15%,页面明显流畅了。你可以根据自己的需求调整延迟时间,数据少的话200毫秒也行,数据多就用500毫秒。

技巧3:关键词高亮,让结果更直观

用户搜索“蓝色”时,如果结果里能把“蓝色”两个字标红,体验会更好。实现方法很简单:在展示结果时,把关键词替换成带标签的高亮文本。

// 在生成结果时,替换关键词为高亮文本

function highlightKeyword(text, keyword) {

if (!keyword) return text; // 关键词为空时不高亮

const regex = new RegExp(keyword, 'gi'); // 'g'全局匹配,'i'忽略大小写

return text.replace(regex, match => ${match});

}

// 在resultItem.innerHTML里调用这个函数

resultItem.innerHTML =

${highlightKeyword(item.title, keyword)}

${highlightKeyword(item.content, keyword)}

;

这个功能特别受用户欢迎,我朋友的客户反馈说:“看到红色的字就知道是不是我要找的了,不用仔细看全文。”

按照上面的步骤,你已经有了一个带样式、实时搜索、关键词高亮的搜索功能。最后提醒一句:写完后一定要测试!比如试试输入关键词、不输关键词、输错别字,看看结果是否符合预期。我每次写完都会用这3种情况测试,避免上线后出bug。

如果你按这些方法试了,欢迎回来告诉我效果!要是遇到代码报错,也可以把报错信息发给我,咱们一起看看怎么解决~


你知道吗?现在用户用搜索框的时候,其实很少有人会特意去点那个“搜索”按钮——不管是电脑端还是手机端,大家更习惯打完字直接按回车。我之前帮一个做教程网站的客户改页面,他原来的搜索框必须点按钮才能搜,后来加了回车触发功能,后台数据显示搜索使用率直接涨了25%,尤其是手机用户,因为虚拟键盘上的“搜索”键其实就是回车键,加上这个功能后用户操作顺畅多了。

具体实现特别简单,你不用改太多代码,就在原来的input标签里加一小段事件监听就行。比如你原来的搜索框代码是,现在改成,这样用户按回车键的时候,浏览器就会自动执行你写的search()函数了。这里有个小细节要注意,event.key === ‘Enter’是判断按下的是不是回车键,有些老教程可能会用keyCode === 13,但现在更推荐用event.key,兼容性更好,而且代码读起来也直观——你一看就知道是“Enter”键,不用记13这个数字。

我之前给一个电商网站加这个功能时,还遇到过个小问题:有些用户习惯快速按两下回车,结果触发了两次搜索。后来我就在search()函数开头加了个判断,比如设个变量isSearching,开始搜索时设为true,搜索结束再设为false,这样如果第一次搜索还没结束,第二次按回车就不会重复执行了。 如果你同时做了实时搜索(就是输入时自动搜),记得把回车触发和实时搜索结合起来——比如用户输完直接回车,就立刻执行搜索,不用等实时搜索的延迟,这样体验会更灵活。之前有个用户反馈说:“本来输到一半它自己就搜了,结果我想确认一下按了回车,居然又搜了一次,有点多余。”后来我调整了逻辑,当用户主动按回车时,就清除实时搜索的延迟定时器,直接执行一次搜索,这样就不会重复了。


搜索功能必须用后端代码吗?纯HTML能实现吗?

纯前端也能实现基础搜索功能,不需要后端支持。像文章里的示例,直接用JavaScript数组存储数据(比如商品列表、文章标题),通过前端筛选匹配关键词即可。这种方式适合数据量不大(比如100条以内)的静态网站,开发快、不用服务器。如果数据量超过500条, 搭配后端接口,避免前端加载过慢。

搜索框怎么实现按回车键触发搜索,不用点按钮?

可以给搜索框添加键盘事件监听。比如在input标签里加onkeydown="if(event.key === 'Enter') search()";,这样用户按回车键时就会执行search()函数。我给朋友的网站加过这个功能,她反馈说“比点按钮方便多了,手机上打字完直接回车就能搜”。

数据太多时(比如500条以上),前端搜索会卡顿吗?

可能会。前端搜索是把所有数据加载到浏览器后筛选,如果数据超过500条,频繁搜索时可能出现延迟。 两种优化方式:一是用“防抖”(文章里提到的300毫秒延迟)减少搜索触发次数;二是如果数据超1000条,优先考虑后端接口搜索(比如用PHP+MySQL),让服务器返回筛选后的结果,性能会好很多。

能不能直接搜索网页上已有的内容,不用单独写data数组?

可以。如果你的内容已经显示在页面上(比如博客文章列表、商品卡片),不用单独定义data数组,直接用JavaScript获取页面元素内容即可。比如用document.querySelectorAll('.article-item')获取所有文章元素,再提取标题和内容存入临时数组,后续搜索逻辑和文章里的一样。我给一个企业官网做过这种,直接搜索页面上的新闻列表,省了单独维护数据的功夫。

搜索结果能按匹配度排序吗?比如标题含关键词的排在前面?

可以。默认筛选是无序的,想按匹配度排序,只需在筛选后加一段排序逻辑。比如:标题包含关键词的排前面,内容包含的排后面;或者统计关键词出现次数,次数多的排前面。举个简单例子:matchedResults.sort((a, b) => { const aTitle = a.title.includes(keyword) ? 1 0; const bTitle = b.title.includes(keyword) ? 1 0; return bTitle

  • aTitle; })
  • ,这样标题含关键词的结果就会排在前面。

    原文链接:https://www.mayiym.com/32159.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码