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 IE 浏览器判定代码
Mar 21 Javascript
jQuery学习基础知识小结
Nov 25 Javascript
jQuery层次选择器选择元素使用介绍
Apr 18 Javascript
JavaScript实现select添加option
Jul 03 Javascript
详解Node.js如何开发命令行工具
Aug 14 Javascript
15个非常实用的JavaScript代码片段
Dec 18 Javascript
jquery对象与DOM对象转化
Feb 08 Javascript
BootStrap表单时间选择器详解
May 09 Javascript
JavaScript实现随机数生成器(去重)
Oct 13 Javascript
微信小程序自定义可滑动日历界面
Dec 28 Javascript
详解在React项目中安装并使用Less(用法总结)
Mar 18 Javascript
Javascript实现html转pdf高清版(提高分辨率)
Feb 19 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
简单易用的计数器(数据库)
2006/10/09 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
js宝典学习笔记(上)
2007/01/10 Javascript
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
js this函数调用无需再次抓获id,name或标签名
2014/03/03 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
微信小程序实现评论功能
2018/11/28 Javascript
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
基于python socketserver框架全面解析
2017/09/21 Python
Python并行分布式框架Celery详解
2018/10/15 Python
python系列 文件操作的代码
2019/10/06 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
信息专业本科生个人的自我评价
2013/10/28 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL