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 this调用规则说明
Mar 08 Javascript
js读取本地excel文档数据的代码
Nov 11 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
Jun 20 Javascript
javascript字符串替换及字符串分割示例代码
Dec 12 Javascript
javaScript如何生成xmlhttp
Dec 16 Javascript
使用jquery修改表单的提交地址基本思路
Jun 04 Javascript
JS实现从网页顶部掉下弹出层效果的方法
Aug 06 Javascript
使用Chart.js图表库制作漂亮的响应式表单
Oct 28 Javascript
BootStrap glyphicon图标无法显示的解决方法
Sep 06 Javascript
分分钟玩转Vue.js组件
Oct 25 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
Nov 28 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中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
php目录拷贝实现方法
2015/07/10 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
PHP线程的内存回收问题
2016/07/08 PHP
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
python购物车程序简单代码
2018/04/18 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
2018/05/10 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
安全月宣传标语
2014/10/07 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
自荐信模板大全
2015/03/27 职场文书
SQL Server 中的事务介绍
2022/05/20 SQL Server