搜索关键字高亮

文章目录

    • 思路分析
    • 具体实现
    • 源码

不知道大家平常有没有自己空闲的时候写一些小demo的习惯呢?我个人觉得,在空闲的时候时不时写一个小功能,日积月累,当你以后遇到需要使用的时候,就可以直接拿来使用,当然了。业务的需求多变的,多少可能会改一点,不过也一定比从没写过开始写要快得多,本文就介绍一个比较有意思但是也很简单的案例–搜索关键字高亮

思路分析

  1. 当我们需要对关键词高亮的时候,先决条件是什么呢?毫无疑问,是我们需要对数据进行匹配,找到和关键词相匹配的内容
  2. 而找到这个内容之后,如何进行高亮呢?在页面中,我们需要对文字进行颜色改变或者其他样式设置的时候,是不是都需要给其包裹一个标签,这里也不例外,假设我们有一段数据是:123456,我们搜索的是 23,我们需要对这段文本改造为 1<span>23</span>456,而后我们对这个 span 标签设置不同的颜色或者其他样式,在显示到页面上,是不是就可以了呢

具体实现

  1. 我们先看一下样式布局吧,这个样式布局非常简单,我就只展示显示的效果了,可以自己实现,或者在文章末尾直接复制源码,如图:

    在这里插入图片描述

  2. 现在就是根据我们的分析来具体实现,准备的数据如下:

    const data = ['我们等待着戈多,在等待的过程中发现戈多就是等待本身。--王希明','我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。--Enchiridion','慢慢来,谁还没有一个努力的过程。--网易云音乐','上了陆地的鱼就不能再叫做鱼了。--三体:黑暗森林','历史的发展是不以人的意志为转移的。--毛泽东','人生天地间,忽如远行客。--古诗十九首','甲之蜜糖,乙之砒霜。--曼陀罗','回眸一笑百媚生,六宫粉黛无颜色。--长恨歌','天之涯,地之角,知交半零落,一壶浊酒尽余欢,今宵别梦寒。--送别','荒诞也好,愚笨也好,总会过去的。--一瞬的光和永远'
    ]
    
  3. 获取 dom,绑定事件如下:

    const contentList = document.querySelector('.content-list')
    const inp = document.querySelector('.inp')form.addEventListener('submit', function (e) {e.preventDefault()render(data, inp.value)
    })
    
  4. 是不是发现了藏在这个事件里面的 render 函数呢?我们的核心就是实现这个函数,这个函数接收两个参数,一个是数据列表,一个是关键词,于是我们可以根据写出 render 函数的函数签名,如下:

    function render(list, keyword){}
    
  5. 然后我们就应该来思考一下,前置条件,在这里,我们明显只有一个条件,那就是有没有关键词,有的话如何,没有的话又如何,首先我们第一步是不是要通过这个有没有关键词进行筛选数据呢?

    function render(list, keyword){let newList = listif (keyword) {// 根据关键词输入的筛选数据newList = list.filter(item => item.includes(keyword))}
    }
    
  6. 在筛选数据的时候,就可以感觉到如果需要往下执行,我们还缺少一个条件,关键词匹配的条件,关键词匹配,我们可以想到什么?是不是正则表达式呢?所以我们还需要定义条件,当有关键词的时候,需要创建一个正则表达式,如下:

    function render(list, keyword) {let newList = listlet regif (keyword) {newList = list.filter(item => item.includes(keyword))// 创建正则表达式reg = new RegExp(keyword, 'gi')}}
    
  7. 而有了这个筛选后的数据和正则,我们就可以进行真正的渲染了,这个渲染可以手动通过方法创建元素,也可以直接设置 html 字符串,我这里方便演示,就直接使用设置 html 字符串了,如下:

    function render(list, keyword) {let newList = listlet regif (keyword) {newList = list.filter(item => item.includes(keyword))// 创建正则表达式reg = new RegExp(keyword, 'gi')}contentList.innerHTML = newList.map(item=>{// 设置默认值let content = item// 如果存在有正则表达式存在则表示需要对内容进行关键词匹配if (reg) {// 将匹配的关键词通过 replace 方法进行替换-并重新赋值给 contentcontent = item.replace(reg, `<span class="highlight">${keyword}</span>`)}// 返回组装的 html 字符串return `<div class="item-box"><p class="item-content">${content}</p></div>`}).join('')
    }
    
  8. 这里我们给高亮的 span 的类名定义为 highlight,所以响应的我们需要再 css 文件中定义这样的一个高亮关键词样式,如下:

    /* 设置关键词样式 */
    .item-content .highlight {color: #ff4757;font-weight: bold;
    }
    
  9. 我们最后来看一下展示的效果,如图:

    在这里插入图片描述

  10. 这个数据的筛选,是不是需要,可以自己根据自己的需求来设计,这个案例整体是不是还是比较简单呢

源码

  • index.html

    <!DOCTYPE html>
    <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./index.css">
    </head><body><div class="container"><!-- 搜索 --><div class="search-box"><form id="form"><input class="inp" autocomplete="off" spellcheck="false" type="text" id="keyword" placeholder="请输入关键字"><button type="submit" style="display: none;"></button></form></div><!-- 内容列表 --><div class="content-list"></div></div><script src="./index.js"></script>
    </body></html>
    
  • index.css

    * {margin: 0;padding: 0;box-sizing: border-box;
    }.container {width: 100vw;height: 100vh;overflow: hidden;padding: 50px;
    }.search-box {width: 300px;height: 35px;border: 1px solid #999;border-radius: 3px;margin-bottom: 20px;
    }.search-box input {all: unset;padding: 0 5px;height: 35px;font-size: 14px;
    }input::placeholder {color: #ccc;
    }.content-list {width: 720px;flex: 1;overflow: hidden auto;
    }.item-box {margin-bottom: 10px;
    }.item-content {color: #130f40;font-size: 16px;
    }/* 设置关键词样式 */
    .item-content .highlight {color: #ff4757;font-weight: bold;
    }
    
  • index.js

    const data = ['我们等待着戈多,在等待的过程中发现戈多就是等待本身。--王希明','我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。--Enchiridion','慢慢来,谁还没有一个努力的过程。--网易云音乐','上了陆地的鱼就不能再叫做鱼了。--三体:黑暗森林','历史的发展是不以人的意志为转移的。--毛泽东','人生天地间,忽如远行客。--古诗十九首','甲之蜜糖,乙之砒霜。--曼陀罗','回眸一笑百媚生,六宫粉黛无颜色。--长恨歌','天之涯,地之角,知交半零落,一壶浊酒尽余欢,今宵别梦寒。--送别','荒诞也好,愚笨也好,总会过去的。--一瞬的光和永远'
    ]const contentList = document.querySelector('.content-list')
    const inp = document.querySelector('.inp')form.addEventListener('submit', function (e) {e.preventDefault()render(data, inp.value)
    })function render(list, keyword) {let newList = listlet regif (keyword) {newList = list.filter(item => item.includes(keyword))reg = new RegExp(keyword, 'gi')}contentList.innerHTML = newList.map(item => {let content = itemif (reg) {content = item.replace(reg, `<span class="highlight">${keyword}</span>`)}return `<div class="item-box"><p class="item-content">${content}</p></div>`}).join('')
    }render(data, '')
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/823212.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础02-Java编程基础

文章目录 变量&#xff08;Variables&#xff09;局部变量和成员变量局部变量&#xff08;Local Variables&#xff09;成员变量&#xff08;Instance Variables&#xff09; 标识符&#xff08;Identifiers&#xff09;八种基本数据类型原始数据类型&#xff08;Primitive Dat…

ESP32:整合存储配网信息和MQTT笔记

文章目录 1.给LED和KEY的所用IO增加配置项1.1 增加配置文件1.2 修改相应的c源码 2. 把mqtt\tcp的工程整合到一起2.1 在何处调用 mqtt_app_start() 3. 测试MQTT4. 完整的工程源码 有一段时间没有玩ESP32&#xff0c;很多知识点都忘记了。今天测试一下MQTT&#xff0c;做个笔记。…

『番外篇六』SwiftUI 取得任意视图全局位置的三种方法

概览 在 SwiftUI 开发中,利用描述性代码我们可以很轻松的构建各种丰富多彩的视图。我们可以设置它们的大小、位置、颜色并应用不计其数的修改器。 但是,小伙伴们是否想过在 SwiftUI 中如何获取一个视图的全局位置坐标呢? 在本篇博文中,您将学到如下内容: 概览1. SwiftU…

C语言中灵活多变的动态内存管理,malloc函数 free函数 calloc函数 realloc函数

文章目录 &#x1f680;前言&#x1f680;管理动态内存的函数✈️malloc函数✈️free函数✈️calloc函数✈️realloc函数 &#x1f680;在使用动态内存函数时的常见错误✈️对NULL指针的解引用✈️ 对动态开辟空间的越界访问✈️对非动态开辟内存使用free释放✈️使用free释放一…

数据统计的一些专业术语学习

数据统计的一些专业术语学习 1. 极差2. 方差3. 标准差4. 均值绝对差 1. 极差 数据统计的极差&#xff0c;又称全距&#xff0c;是指一组数据中最大值和最小值之差。 举个例子&#xff0c;如果我们有一组数据&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c…

main参数传递、反汇编、汇编混合编程

week03 一、main参数传递二、反汇编三、汇编混合编程 一、main参数传递 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成“求命令行传入整数参数的和” 注意C中main: int main(int argc, char *argv[]), 字符串“12” 转为12&#xff0c;可以调用atoi…

大数据Doris(四十五):物化视图选择最优

文章目录 物化视图选择最优 物化视图选择最优 下面详细解释一下第一步最优物化视图是被如何选择出来的。 这里分为两个步骤: 对候选集合进行一个过滤。只要是查询的结果能从物化视图数据计算(取部分行,部分列,或部分行列的聚合)出都可以留在候选集中,过滤完成后候选集合…

山西电力市场日前价格预测【2023-12-28】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-28&#xff09;山西电力市场全天平均日前电价为814.30元/MWh。其中&#xff0c;最高日前电价为1500.00元/MWh&#xff0c;预计出现在08:00~08:45,17:00~20:15。最低日前电价为394.61元/…

C#的checked关键字判断是否溢出

目录 一、定义 二、示例&#xff1a; 三、生成&#xff1a; 一、定义 使用checked关键字处理溢出。 在进行数学运算时&#xff0c;由于变量类型不同&#xff0c;数值的值域也有所不同。如果变量中的数值超出了变量的值域&#xff0c;则会出现溢出情况&#xff0c;出现溢出…

2023第三届中国高效大数据挑战赛A题思路及代码

一、题目介绍 赛题 A 中文文本纠错 中文文本纠错的任务主要是针对中文文本中出现的错误进行检测和纠正&#xff0c;属 于人工智能自然语言处理的研究子方向。中文文本纠错通常使用的场景有政务公 文、裁判文书、新闻出版等&#xff0c;中文文本纠错对于以中文作为母语的使用者…

nodejs+vue网上书城图书销售商城系统io69w

功能介绍 该系统将采用B/S结构模式&#xff0c;使用Vue和ElementUI框架搭建前端页面&#xff0c;后端使用Nodejs来搭建服务器&#xff0c;并使用MySQL&#xff0c;通过axios完成前后端的交互 系统的主要功能包括首页、个人中心、用户管理、图书类型管理、图书分类管理、图书信…

启动springboot时报错 APPLICATION FAILED TO START 包冲突

启动springboot时报错 APPLICATION FAILED TO START 包冲突 problem 具体日志如下 *************************** APPLICATION FAILED TO START ***************************Description:An attempt was made to call a method that does not exist. The attempt was made fr…

集群部署篇--Redis 主从模式

文章目录 前言Redis 主从部署&#xff1a;1.1 主从架构 介绍&#xff1a;1.2 主从架构 实现&#xff1a;1.2.1 redis 安装&#xff1a; 1.3 主从架构优缺点&#xff1a;1.4 故障转移&#xff1a; 总结 前言 显然在线上环境中 Redis 服务不能以单机的方式运行&#xff0c;必须有…

竞赛保研 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

RAID卡

目录 一、RAID概述 二、常见类型 &#xff08;一&#xff09;RAID 0 &#xff08;二&#xff09;RAID 1 &#xff08;三&#xff09;RAID 5 &#xff08;四&#xff09;RAID 6 &#xff08;五&#xff09;RAID 10 &#xff08;六&#xff09;总结 三、创建RAID &…

几代WiFi有什么差异,它们有什么区别

最典型的差异指标&#xff1a;单流传输速率 第一代 基于的标准&#xff1a; 802.11 使用频率&#xff1a;2.4GHz 单流最大传输速率&#xff1a;2Mbit/s 第二代 基于的标准&#xff1a; 802.11b 使用频率&#xff1a;2.4GHz 单流最大传输速率&#xff1a;11Mbit/s 第三代 …

新版 macos下安装python 2.7 python 3.x多版本简单方法 pyenv python多版本管理工具

在新版本的macos中已经将默认的python升级成了3.x , 今天介绍一个简单的方法在新版本的macos中快速安装 python 2.7的方法, 就是使用brew安装python版本管理工具 pyenv来安装python2.7 # 安装pyenv版本管理工具 brew install pyenv # 安装python2.7 可以安装多个版本的ptyhon…

论文阅读——Slide-Transformer(cvpr2023)

Slide-Transformer: Hierarchical Vision Transformer with Local Self-Attention 一、分析 1、改进transformer的几个思路&#xff1a; &#xff08;1&#xff09;将全局感受野控制在较小区域&#xff0c;如&#xff1a;PVT&#xff0c;DAT&#xff0c;使用稀疏全局注意力来…

Linux:apache优化(3)—— 页面缓存时间

作用&#xff1a;通过 mod_expires 模块配置 Apache&#xff0c;使网页能在客户端浏览器缓存一段时间&#xff0c;以避免重复请求&#xff0c;减轻服务端工作压力。启用 mod_expires 模块后&#xff0c;会自动生成页面头部信息中的 Expires 标签和 CacheControl 标签&#xff0…

利用 IntelliJ IDEA 整合 GitHub 实现项目版本控制与协作管理

目录 前言1 设置GitHub登录账号2 将项目分享到GitHub3 IntelliJ IDEA 中导入Github项目4 往GitHub推送代码4.1 Commit Change&#xff08;提交到本地库&#xff09;4.2 Git -> Repository -> Push&#xff08;推送到远程库&#xff09; 5 拉取远程库代码到本地6 克隆远程…