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 用Node.js写Shell脚本[译]
Sep 20 Javascript
node.js中的console.log方法使用说明
Dec 09 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
Nov 02 Javascript
详解JavaScript时间格式化
Dec 23 Javascript
实现隔行换色效果的两种方式【实用】
Nov 27 Javascript
jQuery Validate验证框架详解(推荐)
Dec 17 Javascript
关于vue.js组件数据流的问题
Jul 26 Javascript
基于node.js express mvc轻量级框架实践
Sep 14 Javascript
node 利用进程通信实现Cluster共享内存
Oct 27 Javascript
Vue数组响应式操作及高阶函数使用代码详解
Aug 01 Javascript
三步搞定:Vue.js调用Android原生操作
Sep 07 Javascript
前端性能优化建议
Sep 17 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中使用redis队列操作实例代码
2013/02/07 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
python变量命名的7条建议
2019/07/04 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
python 8种必备的gui库
2020/08/27 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
中国央视网签名寄语
2014/01/18 职场文书
社区端午节活动方案
2014/01/28 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
理财计划书
2014/08/14 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL