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 相关文章推荐
JavaScript中的事件处理
Jan 16 Javascript
使用Chrome浏览器调试AngularJS应用的方法
Jun 18 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
JS 动态判断PC和手机浏览器实现代码
Sep 21 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
Jul 13 Javascript
关于react中组件通信的几种方式详解
Dec 10 Javascript
JS实现的DOM插入节点操作示例
Apr 04 Javascript
解决Layui数据表格中checkbox位置不居中的方法
Aug 15 Javascript
vue form 表单提交后刷新页面的方法
Sep 04 Javascript
layer.open回调获取弹出层参数的实现方法
Sep 10 Javascript
超简单的微信小程序轮播图
Nov 22 Javascript
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
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/07/12 PHP
php 在线打包_支持子目录
2008/06/28 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
php商品对比功能代码分享
2015/09/24 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
js跨域和ajax 跨域问题的实现思路
2009/09/05 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
python线程池threadpool使用篇
2018/04/27 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
10行Python代码计算汽车数量的实现方法
2019/10/23 Python
python多线程使用方法实例详解
2019/12/30 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
创业计划书的内容步骤和要领
2014/01/04 职场文书
企业给企业的表扬信
2014/01/13 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
大专生找工作自荐书
2014/06/10 职场文书
清洁工个人总结
2015/03/04 职场文书
2015年司机工作总结
2015/04/23 职场文书
Promise静态四兄弟实现示例详解
2022/07/07 Javascript