js全局搜索高亮显示

一、目的

模拟浏览器ctrl+F功能,对输入内容进行搜索,并高亮显示

输入想要搜索的内容:

对应内容高亮显示:

二、实现

成功实现:

<body>
  <button>点击搜索</button>
  <input class="hidden" type="text">
  <div class="content">
    <p>在这个宁静的夜晚,月光洒在静谧的湖面上,波光粼粼。</p>
    <p>湖边的柳树随风轻摆,仿佛在诉说着古老的传说。</p>
    <p>远处,偶尔传来几声蛙鸣,伴随着夜风的轻吟,构成了一首自然的交响乐。</p>
    <p>散步的人们享受着这份宁静,脸上洋溢着平和的微笑。</p>
    <p>这是,一个充满希望与梦想的世界,每个人都在这片星空下寻找着自己的位置。</p>
    
  </div>
</body>
<script>
  const btn = document.querySelector('button');
  const input = document.querySelector('input');
  const content = document.querySelector('.content');
  const html = content.innerHTML;

  btn.addEventListener('click', () => {
    if(input.classList.contains('hidden')){
      input.classList.remove('hidden');
    } else {
      input.classList.add('hidden');
    }
  })
  //按下Ctrl+F,搜索框出现
  window.addEventListener('keydown',(event)=>{
    if(event.ctrlKey && event.keyCode == 70){
      if(input.classList.contains('hidden')){
        input.classList.remove('hidden');
      }
    }
  })
  //匹配高亮
  input.addEventListener('input',()=>{
    console.log(input.value);
    //先还原回初始状态
    content.innerHTML = html;
    //获取输入内容
    const value = input.value;
    //有输入内容
    if(value){
      let regValue = new RegExp(value, "g");//匹配value
      let regHtml = new RegExp("\<.*?\>", "ig");//匹配html元素
      let htmls = content.innerHTML.match(regHtml); //存放html元素的数组

      let text = content.innerHTML;
      text = text.replace(regHtml, '{~}');  //替换html标签
     
      //替换value
      text = text.replace(regValue, `<span class="highlight">${value}</span>`); 

      htmls.forEach(html=>{
        text = text.replace(/{~}/g,html);
      })
      content.innerHTML = text;
    }

  })
</script>
  <style>
    .highlight{
      background-color: #ffc400;
    }
    .hidden{
      display: none;
    }
  </style>

错误实现:

<body>
  <button>点击搜索</button>
  <input class="hidden" type="text">
  <p>在这个宁静的夜晚,月光洒在静谧的湖面上,波光粼粼。</p>
  <p>湖边的柳树随风轻摆,仿佛在诉说着古老的传说。</p>
  <p>远处,偶尔传来几声蛙鸣,伴随着夜风的轻吟,构成了一首自然的交响乐。</p>
  <p>散步的人们享受着这份宁静,脸上洋溢着平和的微笑。</p>
  <p>这是一个充满希望与梦想的世界,每个人都在这片星空下寻找着自己的位置。</p>
    
</body>
<script>
  const btn = document.querySelector('button');
  const input = document.querySelector('input');

  btn.addEventListener('click', () => {
    if(input.classList.contains('hidden')){
      input.classList.remove('hidden');
    } else {
      input.classList.add('hidden');
    }
  })
  //按下Ctrl+F,搜索框出现
  window.addEventListener('keydown',(event)=>{
    if(event.ctrlKey && event.keyCode == 70){
      if(input.classList.contains('hidden')){
        input.classList.remove('hidden');
      }
    }
  })
  
  input.addEventListener('input',()=>{
    const body = document.querySelector('body');
    if(input.value){
      const value = input.value;
      const reg = new RegExp(value, "g");
      const html = content.innerHTML;
      content.innerHTML = html.replace(reg, `<span class="highlight">${value}</span>`);
    }
  })
</script>

1.直接更改body的innerHTML,导致绑定在输入框上的input事件失效

这是因为,修改body的innerHTML相当于重写了body里面的输入框,这就相当于创建了另外一个dom对象,之前渲染的dom跟这个新的dom对象没有关系,所以就导致了事件的丢失。

2.每次不还原初始状态,导致搜索内容改变后,原来的高亮依然存在

所以要在一开始记录初始innerHTML,每次input事件触发后要先还原回初始状态。

3.没有考虑到标签名,直接匹配innerHTML当输入英文时,可能会匹配到标签名

所以先将标签替换成其他内容并将所有标签保存在一个数组中,匹配完成后,再将这部分内容换回原来的标签。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中,要实现全局替换大小写,你可以使用正则表达式和`replace()`方法。你可以使用正则表达式的`/g`标志来表示全局匹配,然后使用`i`标志来表示不区分大小写。下面是一个示例代码: ``` let str = "complete Comlete successful Successful error Error Failed failed"; let result = str.replace(/complete/gi, "replaced"); console.log(result); ``` 这段代码将会把字符串中所有的"complete"(不区分大小写)替换为"replaced"。因此,最终输出的结果将会是:"replaced Comlete successful Successful error Error Failed failed"。 注意,在上述代码中,我们使用了正则表达式`/complete/gi`来匹配所有的"complete",并且使用`replace()`方法将其替换为"replaced"。其中,`/g`表示全局匹配,`i`表示不区分大小写。 希望这个解答对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JavaScript之全局函数详解](https://blog.csdn.net/weixin_45735355/article/details/119953872)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [用JavaScript实现全局替换,解决$等特殊符号的难题](https://download.csdn.net/download/weixin_38516706/13617459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [vue replace()实现关键词高亮(多组关键词)全局匹配不区分大小写](https://blog.csdn.net/weixin_43085245/article/details/125516023)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值