IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> vue 实现Ctrl+F搜索功能(定位+滚动的效果)(解决掉能搜查标签属性) -> 正文阅读

[游戏开发]vue 实现Ctrl+F搜索功能(定位+滚动的效果)(解决掉能搜查标签属性)

vue 实现Ctrl+F搜索功能(解决掉能搜查标签属性)兼容IE

1、先看效果
在这里插入图片描述
在这里插入图片描述
2、搜索栏代码

<el-input
            v-model="searchText"
            placeholder="请输入关键字"
            prefix-icon="el-icon-search"
            clearable
            size="small"
            @keyup.enter.native="search"
          >
          </el-input>
          <el-button
            type="primary"
            size="small"
            icon="el-icon-search"
            @click="search"
          ></el-button>
          <div class="searchRight">
            <span class="item" style="margin-right: 5px">
              {{ num === 0 ? '没有任何结果' : indexNum + 1 + '/' + num }}</span>
            <el-tooltip
              class="item"
              effect="dark"
              content="上一个"
              placement="top"
            >
              <el-button
                icon="el-icon-arrow-up"
                circle
                type="text"
                size="mini"
                @click="prev"
              ></el-button>
            </el-tooltip>
            <el-tooltip
              class="item"
              effect="dark"
              content="下一个"
              placement="top"
            >
              <el-button
                icon="el-icon-arrow-down"
                circle
                type="text"
                size="mini"
                @click="next"
              ></el-button>
            </el-tooltip>
          </div>

3、data() {return { } } 里的代码

// 搜索,
      searchText: '',
      scroll: '',
      index: 1,
      query: '',
      preQuery: '',
      indexNum: 0,
      num: 0,
      main: null,
      showArr: [],
      showIndex: 0,

4、滚动

mounted() {
    // scroll代表滚动条距离页面顶部距离
    window.addEventListener('scroll', this.dataScroll)
    this.mian = document.querySelector('.log_content')
  },

5、实现搜索、上一个、下一个、颜色替换功能

// 搜索
    search() {
      this.num = 0
      this.indexNum = 0
      this.query = this.searchText
      // eslint-disable-next-line prefer-const
      // document.querySelector 这里获取标签需要自己换一下
      let main = this.main || document.querySelector('.log_content > .docx-wrapper > .docx')
      var innerHTML = main.innerHTML
      // 如果要兼容IE就使用下面的正则 (谷歌 IE 都可以使用)
      //innerHTML = innerHTML.replace(new RegExp('<[^>]+>', 'g'), function(str) {
        //return str.replace(new RegExp('(<\/?em.*?>)|(<\/?strong.*?>)', 'g'), '')
      //})
      //------ 这行代码不兼容IE
      const emReg1 = new RegExp('<em style="background-color: yellow">', 'g')
      innerHTML = innerHTML.replace(emReg1, '')
      const emReg2 = new RegExp('</em>', 'g')
      innerHTML = innerHTML.replace(emReg2, '')
      const emReg3 = new RegExp('<strong style="background-color: #ff9632">', 'g')
      innerHTML = innerHTML.replace(emReg3, '')
      const emReg4 = new RegExp('</strong>', 'g')
      innerHTML = innerHTML.replace(emReg4, '')
      // ------
      main.innerHTML = innerHTML
      // 设置本次搜索背景色
      if (this.searchText !== '' && this.searchText !== ' ') {
        const reg = new RegExp(this.searchText, 'g')
        const searchText = this.searchText
        var mainInnerHTML = innerHTML.replace(new RegExp('(?=\>).+?(?=\<)', 'g'), function(str) {
          const reg1 = new RegExp('(?=>).+', 'g')
          return str.replace(new RegExp('(>).+', 'g'), function(str2) {
            return str2.replace(reg1, function(str1) {
              return str1.replace(reg, '<em style="background-color: yellow">' + searchText + '</em>')
            })
          })
        })
        main.innerHTML = mainInnerHTML
      }
      // 替换配置
      this.getSearchList()
    },
    getSearchList() {
      // em标签都是被替换的 所以em标签的数量就是搜索到关键字的数量
      const num = document.getElementsByTagName('em').length
      this.num = num
      if (num !== 0) {
        document.getElementsByTagName('em')[0].innerHTML =
          '<strong style="background-color: #ff9632">' +
          this.searchText +
          '</strong>'
        // 滚动到第一个关键字位置
        document.getElementsByTagName('em')[0].scrollIntoView({
          block: 'start',
          behavior: 'smooth'
        })
      }
    },
    dataScroll() {
      this.scroll =
        document.documentElement.scrollTop || document.body.scrollTop
    },
    // 下一个
    next() {
      if (this.num !== 0) {
        for (let i = 0; i < document.getElementsByTagName('em').length; i++) {
          document.getElementsByTagName('em')[i].innerHTML = this.searchText
        }
        if (this.indexNum === this.num - 1) {
          this.indexNum = 0
        } else {
          this.indexNum = this.indexNum + 1
        }
        document.getElementsByTagName('em')[this.indexNum].innerHTML =
          '<strong style="background-color: #ff9632">' +
          this.searchText +
          '</strong>'
        document.getElementsByTagName('em')[this.indexNum].scrollIntoView()
      }
    },
    // 上一个
    prev() {
      if (this.num !== 0) {
        for (let i = 0; i < document.getElementsByTagName('em').length; i++) {
          document.getElementsByTagName('em')[i].innerHTML = this.searchText
        }
        if (this.indexNum === 0) {
          this.indexNum = this.num - 1
        } else {
          this.indexNum = this.indexNum - 1
        }
        document.getElementsByTagName('em')[this.indexNum].innerHTML =
          '<strong style="background-color: #ff9632">' +
          this.searchText +
          '</strong>'
        document.getElementsByTagName('em')[this.indexNum].scrollIntoView()
      }
    }
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 12:10:15  更:2022-04-28 12:12:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:47:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码