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 相关文章推荐
为数据添加append,remove功能
Oct 03 Javascript
js特效,页面下雪的小例子
Jun 17 Javascript
javascript中setTimeout的问题解决方法
May 08 Javascript
js使用for循环查询数组中是否存在某个值
Aug 12 Javascript
浅谈JS中json数据的处理
Jun 30 Javascript
C#微信小程序服务端获取用户解密信息实例代码
Mar 10 Javascript
详解微信小程序 相对定位和绝对定位
May 11 Javascript
es6新特性之 class 基本用法解析
May 05 Javascript
Vue.directive使用注意(小结)
Aug 31 Javascript
少女风vue组件库的制作全过程
May 15 Javascript
微信小程序自定义头部导航栏(组件化)
Nov 15 Javascript
Element Backtop回到顶部的具体使用
Jul 27 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中如何调用用户自定义函数
2013/08/06 PHP
php动态绑定变量的用法
2015/06/16 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
node.js中的fs.rmdirSync方法使用说明
2014/12/16 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
jQuery Validate插件ajax方式验证输入值的实例
2017/12/21 jQuery
jquery写出PC端轮播图实例
2018/01/26 jQuery
Python编程中的异常处理教程
2015/08/21 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
python通过zabbix api获取主机
2018/09/17 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
python mysql中in参数化说明
2020/06/05 Python
澳大利亚相机之家:Camera House
2017/11/30 全球购物
Perfume’s Club德国官网:在线购买香水
2019/04/08 全球购物
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
教师岗位职责
2013/11/17 职场文书
公关关系专员的自我评价分享
2013/11/20 职场文书
店长职务说明书
2014/02/04 职场文书
《老王》教学反思
2014/02/23 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
葬礼司仪主持词
2014/03/31 职场文书
销售求职信范文
2014/05/26 职场文书
2014年科普工作总结
2014/12/06 职场文书
党员争先创优承诺书
2015/01/20 职场文书
花田少年史观后感
2015/06/16 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
python 网络编程要点总结
2021/06/18 Python