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 相关文章推荐
Jsonp 跨域的原理以及Jquery的解决方案
May 18 Javascript
始终在屏幕中间显示Div的代码(css+js)
Mar 10 Javascript
js的hasownproperty使用示例
Mar 02 Javascript
js验证身份证号有效性并提示对应信息
Oct 19 Javascript
jquery中ajax处理跨域的三大方式
Jan 05 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
Feb 03 Javascript
Jquery实现$.fn.extend和$.extend函数
Apr 14 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
Dec 13 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
May 14 Javascript
vue组件三大核心概念图文详解
May 30 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
Aug 04 Javascript
JavaScript实现前端倒计时效果
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
我的论坛源代码(一)
2006/10/09 PHP
杏林同学录(九)
2006/10/09 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
浅析php创建者模式
2014/11/25 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
django的登录注册系统的示例代码
2018/05/14 Python
简单分析python的类变量、实例变量
2019/08/23 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
python3 kubernetes api的使用示例
2021/01/12 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
初中地理教学反思
2014/01/11 职场文书
年度安全生产目标责任书
2014/07/23 职场文书
超市周年庆活动方案
2014/08/16 职场文书
党员剖析材料范文
2014/09/30 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
2014年党小组工作总结
2014/12/20 职场文书
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫