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 去掉空格实例 Trim() LTrim() RTrim()
Jan 07 Javascript
jQuery选择器源码解读(七):elementMatcher函数
Mar 31 Javascript
JavaScript实现给按钮加上双重动作的方法
Aug 14 Javascript
一系列Bootstrap导航条使用方法分享
Apr 29 Javascript
js实现可输入可选择的select下拉框
Dec 21 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 Javascript
Angularjs 与 bower安装和使用详解
May 11 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
Jul 04 Javascript
微信小程序自定义弹窗实现详解(可通用)
Jul 04 Javascript
Vue仿微信app页面跳转动画效果
Aug 21 Javascript
Vue 实现简易多行滚动&quot;弹幕&quot;效果
Jan 02 Javascript
深度解读vue-resize的具体用法
Jul 08 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
重置版战役片段
2020/04/09 魔兽争霸
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
JS event使用方法详解
2008/04/28 Javascript
javascript window对象属性整理
2009/10/24 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Python实现的数据结构与算法之队列详解
2015/04/22 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
python先序遍历二叉树问题
2017/11/10 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
Weblogic的布署方式
2013/08/23 面试题
介绍一下linux文件系统分配策略
2013/02/25 面试题
毕业生求职简历的自我评价
2013/10/23 职场文书
大学校园活动策划书
2014/02/04 职场文书
幼教求职信
2014/03/12 职场文书
人民调解员培训方案
2014/06/05 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
领导班子对照检查材料
2014/09/22 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
一文搞懂MySQL索引页结构
2022/02/28 MySQL