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 相关文章推荐
共享自己写一个框架DreamScript
Jan 20 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
May 27 Javascript
JavaScript中使用正则匹配多条,且获取每条中的分组数据
Nov 30 Javascript
JS本地刷新返回上一页代码
Jul 25 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Dec 14 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
May 08 Javascript
jQuery返回定位插件详解
May 15 jQuery
浅谈node.js 命令行工具(cli)
May 10 Javascript
一篇文章,教你学会Vue CLI 插件开发
Apr 17 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
Sep 12 Javascript
微信小程序实现同时上传多张图片
Feb 03 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之第二天
2006/10/09 PHP
计数器详细设计
2006/10/09 PHP
PHP array 的加法操作代码
2010/07/24 PHP
php文件缓存类汇总
2014/11/21 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
python生成大写32位uuid代码
2020/03/03 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
python math模块的基本使用教程
2021/01/16 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
Giglio德国网上精品店:奢侈品服装和配件
2016/09/23 全球购物
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
Intersport西班牙:在线体育商店
2019/11/06 全球购物
语文高效课堂实施方案
2014/05/03 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
MySQL系列之十一 日志记录
2021/07/02 MySQL
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL