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 相关文章推荐
Dojo之路:如何利用Dojo实现Drag and Drop效果
Apr 10 Javascript
Firefox outerHTML实现代码
Jun 04 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
Jan 13 Javascript
input输入框鼠标焦点提示信息
Mar 17 Javascript
JavaScript转换二进制编码为ASCII码的方法
Apr 16 Javascript
JS实现随机乱撞彩色圆球特效的方法
May 05 Javascript
原生JS实现拖拽图片效果
Aug 27 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
Jul 07 Javascript
原生js实现无限循环轮播图效果
Jan 20 Javascript
vue  自定义组件实现通讯录功能
Sep 30 Javascript
vue父子组件间引用之$parent、$children
May 20 Javascript
JavaScript canvas实现跟随鼠标移动小球
Feb 09 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编程效率 引入缓存机制提升性能
2010/02/15 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
python的即时标记项目练习笔记
2014/09/18 Python
python文件操作之目录遍历实例分析
2015/05/20 Python
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
设计师珠宝:Ylang 23
2018/05/11 全球购物
GoPro摄像机美国官网:美国运动相机厂商
2018/07/03 全球购物
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
保安拾金不昧表扬信
2014/01/15 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
生产厂长岗位职责
2014/02/21 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
2014年商场工作总结
2014/11/22 职场文书
党小组考察意见
2015/06/02 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书