JS模拟浏览器实现全局搜索功能


Posted in Javascript onSeptember 11, 2019

需要像浏览器的全局搜索一样,搜索指定模块的对应值,然后将匹配到的内容添加背景颜色等。

思路

  • 需要取到当前指定区域的所有内容
  • 然后在取到的内容中找到搜索的内容加上对应的背景颜色
  • 最后在将修改后的内容渲染到页面上

实现

  • 利用innerHTML取到对应模块的内容
  • 编写对应的正则表达式来匹配搜索的内容
  • 利用String.prototype.replace替换匹配到的内容
  • 最后在渲染到页面上

代码实现:

let wrap = document.querySelector('.wrap');
let innerHTML = wrap.innerHTML;
let reg = new RegExp(query, 'g');
innerHTML = innerHTML.replace(reg, '<span style="color: #000; background-color: #e3e4e5">' + query + '</span>');
wrap.innerHTML = innerHTML;

具体的实现搜索实现就完成了,但是上面代码还有个缺陷,就是更换搜索内容时,之前搜索的内容还是具有选中的样式,那么接下来完善功能:

let preQuery = ''; // 上一次搜索的内容
let wrapDom = ''; // 搜索区域的dom元素
function searchFn(dom, query) {
  let wrap = wrapDom || document.querySelector(dom);
  let innerHTML = wrap.innerHTML;
  if (!preQuery) {
    let preReg = new RegExp('<span style="color: #000; background-color: #e3e4e5">' + preQuery + '</span>', 'g');
    innerHTML = innerHTML.replace(preReg, preQuery);
  }
  if (query) {
    let reg = new RegExp(query, 'g');
    innerHTML = innerHTML.replace(reg, '<span style="color: #000; background-color: #e3e4e5">' + query + '</span>');
  }
  wrap.innerHTML = innerHTML;
  preQuery = query;
}

至此搜索高亮的功能就已经实现了。

注意事项

搜索区域的dom元素中不能使用title属性,因为当使用title属性时也会把对应的title属性内容替换,页面渲染时就会产生问题,其实可以将匹配规则的正则表达式重写,但是能力有限,不知道如何编写排除title属性的正则表达式

如果使用Vue等框架编写时,搜索完之后vue相关的事件和属性全都失效了,因为我们这样是直接把dom给换了,这种情况下有两种解决方法:

搜索完成之后,再实例化一次vue

function resetVm() {
  vm.destroy()
  vm = new Vue({...})
}

但是这样会有个问题,重新实例化vue实例之后,搜索内容就没了

不使用vue,可以用jQuery去实现页面,这样就不会有事件失效的问题

总结

以上所述是小编给大家介绍的JS模拟浏览器实现全局搜索功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
对象的类型:本地对象(1)
Dec 29 Javascript
js各种验证文本框输入格式(正则表达式)
Oct 22 Javascript
Javascript 实现图片无缝滚动
Dec 19 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
Dec 23 Javascript
AngularJS入门教程之AngularJS指令
Apr 18 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
Jan 05 Javascript
Angularjs实现页面模板清除的方法
Jul 20 Javascript
Angular6封装http请求的步骤详解
Aug 13 Javascript
vue项目中使用fetch的实现方法
Apr 25 Javascript
js实现橱窗展示效果
Jan 11 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
Apr 09 Javascript
js根据后缀判断文件文件类型的代码
May 09 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
Sep 11 #Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
Sep 10 #Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
Sep 10 #Javascript
layui固定下拉框的显示条数(有滚动条)的方法
Sep 10 #Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
Sep 10 #Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
Sep 10 #Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
Sep 10 #Javascript
You might like
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
php SQL Injection with MySQL
2011/02/27 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
基于jQuery试卷自动排版系统
2010/07/18 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
python输出pdf文档的实例
2020/02/13 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
在 Python 中使用 MQTT的方法
2020/08/18 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
简历中的自我评价怎么写
2014/01/29 职场文书
书香校园建设方案
2014/05/02 职场文书
初中班级口号
2014/06/09 职场文书
优秀党支部申报材料
2014/12/24 职场文书
消防宣传语大全
2015/07/13 职场文书
社区服务活动感想
2015/08/11 职场文书