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 相关文章推荐
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
Jun 06 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
Aug 19 Javascript
jQuery+PHP星级评分实现方法
Oct 02 Javascript
jQuery添加options点击事件并传值实例代码
May 18 Javascript
JS实现最简单的冒泡排序算法
Feb 15 Javascript
ES6中module模块化开发实例浅析
Apr 06 Javascript
javascript算法之二叉搜索树的示例代码
Sep 12 Javascript
深入理解Vue.js轻量高效的前端组件化方案
Dec 10 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
Sep 24 Javascript
Vue作用域插槽实现方法及作用详解
Jul 08 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
Oct 18 Javascript
javascript拖曳互换div的位置实现示例
Jun 28 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简单的留言板与回复功能具体实现
2014/02/19 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
详解python中asyncio模块
2018/03/03 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
解决安装pycharm后不能执行python脚本的问题
2019/01/19 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
python属于跨平台语言码
2020/06/09 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
Ajax的优点和缺点
2014/11/21 面试题
计算机应用专业毕业生求职信
2013/10/24 职场文书
大学自主招生自荐信
2013/12/16 职场文书
社区服务活动小结
2014/07/08 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
庆元旦演讲稿
2014/09/15 职场文书
网站出售协议书范文
2014/10/10 职场文书
环卫个人总结
2015/03/03 职场文书
安全第一课观后感
2015/06/18 职场文书
转变工作作风心得体会
2016/01/23 职场文书