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 相关文章推荐
一个对于js this关键字的问题
Jan 09 Javascript
jquery下onpropertychange事件的绑定方法
Aug 01 Javascript
一个关于jqGrid使用的小例子(行按钮)
Nov 04 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
Dec 29 Javascript
JS中toFixed()方法引起的问题如何解决
Nov 20 Javascript
js实现的切换面板实例代码
Jun 17 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
JavaScript调试之console.log调试的一个小技巧分享
Aug 07 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
Dec 11 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
Feb 22 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
Jul 10 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
Mar 17 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
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
图片自动缩小 点击放大
2008/07/07 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
js数字计算 误差问题的快速解决方法
2017/02/28 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
python3访问sina首页中文的处理方法
2014/02/24 Python
Python中变量交换的例子
2014/08/25 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
python opencv调用笔记本摄像头
2019/08/28 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
如何在python中实现线性回归
2020/08/10 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
abstract是什么意思
2012/02/12 面试题
介绍下Java中==和equals的区别
2013/09/01 面试题
文员个人求职自荐信
2013/09/21 职场文书
人力资源管理专业应届生求职信
2013/09/28 职场文书
皮肤科医师岗位职责
2013/12/04 职场文书
安全生产专项整治方案
2014/05/06 职场文书
高三励志标语
2014/06/05 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
会议主持词开场白
2015/05/28 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书