103、【Ubuntu】【Hugo】搭建私人博客:搜索功能(四)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【Hugo】搭建私人博客:元信息&翻译(三)

分析完了 translation_list.html 剩余内容,并接着分析了 search.html,接下来继续分析

搭建私人博客

接着分析 <input> 输入框内容

  • aria-label="search":无障碍访问,告诉屏幕阅读器这是搜索框 ,屏幕阅读器是视障人士(比如盲人)用的软件,它会把网页内容用语音方式读出来给他们听,而 aria-label 就是直接给元素起个语音名字,让盲人或视障用户通过读屏软件知道这里是个搜索框,可以提升网站的无障碍访问能力,这里 ARIA 全称 Accessible Rich Internet Applications,这个 HTML 属性专门用来增强网页对辅助技术的友好度
  • type="search":告诉浏览器,这是个搜索框类型,这样浏览器可以提供更好的移动端支持,并且语义更清晰, 对人,对机器都友好,可以让站点更专业,更好用
  • autocomplete="off":禁用浏览器自动填充历史,避免干扰搜索建议
  • maxlength="64":限制最多输入 64 个字符

OK,下面是 <searchResults>

可以看到,这是一个空的无序列表 <ul>,初始时没有内容,当用户在 <input> 中输入关键词时,JavaScript 脚本会动态生成 <li> 列表项插入到这里,显示匹配的搜索结果(一般是文章标题),这里的 aria-label 同样是为了无障碍支持

OK,搜索页面的整体布局就已经分析完了,下面先来看一下其效果

  • <header> 布局如下
  • <searchbox> 布局如下

OK,介绍完搜索页面的布局,下面来看搜索功能的实现,Hugo PaperMod 的搜索实现在 assets/js/fastsearch.js

注意,这里的 fastsearch.js 是一个纯前端搜索脚本,运行在用户浏览器中,不涉及任何服务器/后端逻辑,其整个搜索功能完全可以离线使用,非常适合 Hugo 这样的纯静态托管站点

初始化变量

下面来看其详细实现,首先是第一部分:初始化变量

  • import * as params... :从 Hugo 构建系统导入配置参数
  • fuse:使用的模糊搜索方法,这个变量用来存搜索引擎,fuse 实例,引擎实现就是下面的 fuse.basic.min.js
  • resList = ...('searchResults'):这里就是上面布局介绍的搜索结果下拉列表 <ul>
  • sInput=...('searchInput'):同样是上面介绍的搜索输入框 <input>
  • first,last,current_elem:用于键盘导航
  • resultsAvailable:标志位,用来标记是否有搜索结果

这些都是全局变量,后面会用到

加载搜索数据

OK,下面来看第二部分:加载搜索数据

第二部分这里是整个前端搜索功能的核心初始化部分,负责在页面加载完成后,执行下面几个关键步骤:

  • 从远端服务器获取搜索索引数据,这里是索引数据是 index.json(后面介绍)
  • 用 fuse.basic.min.js 构建一个模糊搜索引擎
  • 可以通过配置(比如 Hugo 配置文件的 hugo.toml 的 params)来自定义搜索行为

以确保在页面完全加载后,可以异步加载搜索所需的全文索引数据

注意,这里的 window.onload 指的是用户浏览器中当前网页加载完成,也就是搜索页面在用户浏览器中加载完成 ,举个例子(不是搜索页面的)

  • 用户在浏览器地址栏输入某篇文章的地址,比如 https://myblog.com/posts/article 并回车后
  • 浏览器开始下载 article/index.html,并解析 HTML 内容,加载 CSS,图片,JS 等资源
  • 当所有资源(包括图片,脚本)都加载完毕后,浏览器触发 window.onload 事件,这是用户实际看到页面的时刻,此时 JavaScript 脚本开始运行

这个动作是在用户访问某篇文章页面时,由用户的浏览器执行的


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Hugo】搭建私人博客:搜索功能(AJAX请求)

相关推荐
姜鱼问生3 小时前
Nginx 缓存命中率监控:从 X-Cache-Status 到实时统计
运维·nginx·缓存
Apipi*4 小时前
30天速通Linux 第六章信号及信号处理
linux·运维·信号处理
天启HTTP4 小时前
爬虫防封核心原理:IP轮换机制与风控规避逻辑
linux·服务器·网络·爬虫·tcp/ip
运维行者_5 小时前
网络性能监控怎么做?从自动发现到根因分析的4个环节
运维·服务器·网络·人工智能·支持向量机
此时不提桶,更待何时5 小时前
06-14-A-Kafka集群运维与迁移实战详解
运维·kafka
广州浮点FLOATLIC7 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
IT研究所7 小时前
AI-ITR平台如何减少客户问题反复升级?
大数据·运维·人工智能·低代码·自然语言处理·安全架构·企微
BLUcoding7 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
AIgorithmGEEK7 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil2087 小时前
leetcode 139单词拆分
linux·运维·服务器