您好,登錄后才能下訂單哦!
怎么在vue項目中實現一個ctrl+f搜索功能?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
首先代碼結構如下:
<template> <div> <div class="header"> //頁面頭部,搜索框部分 <div class="search-total"> <div class="search_model_zt"> <div class="search"> <div class="search_icon"><img :src="require('img/search.png')" /></div> <div class="search_input"><input v-model="searchitem" @keyup.enter="submit" placeholder="搜索條文" /></div> </div> </div> </div> </div> <div class="law-content"> //頁面內容部分,具體內容由后端傳入的datelist中的lawContent提供 <div id="content" v-if="datelist" v-html="changeColor(datelist.lawContent)"></div> </div> </div> </template>
搜索內容把對應內容變為紅色的函數就是changeColor
changeColor(item) { let searchitem = this.searchitem; //獲取動態變化的搜索詞 if (searchitem !== '') { //若搜索詞不為空,對搜索詞進行替換 return item.replace(new RegExp(searchitem, 'g'), '<a >' + searchitem + '</a>'); } else { return item; } },
到此,動態輸入標紅搜索詞的功能已經做好了,但是搜索框還有一個回車事件我覺得在實際上也應該有點用,比如跳到第一個關鍵詞什么的,這個時候,我又看見了一個神奇的方法
document.getElementsByTagName("a").scrollIntoView();
當頁面可以支持滑動時,scrollIntoView可以把對于元素滑倒頁面頂部(默認),也可以通過參數賦值給false讓對應元素賦值到底部,僅支持原生js,jQuery中沒有這個方法,那么問題來了,我上面替換出了那么多a標簽,怎么能讓他們排好隊一個一個被調用了,那當然只能遍歷了,但是原生js中沒有jQuery中eq那樣的選擇器,怎么才能讓js知道我要找的是第n個a標簽呢
submit(){ let num = document.getElementsByTagName("a").length; //獲取所有a標簽的數量,這個頁面所有的a標簽都是由查詢替換獲得的,所以a標簽的數量可以當場查詢到關鍵詞的數量 if(num != 0){ //如果查詢關鍵詞存在,跳到第一個關鍵詞的位置,標頭增1,走滿一圈歸0 document.getElementsByTagName("a")[this.searchhead].scrollIntoView(); //scrollIntoView方法只在原生document中可以使用,jquery中沒有這個方法,參數默認是true,將這個元素置于頁面第一行(如果頁面可以滑動函數才生效) if(this.searchhead < (num - 1)){ this.searchhead += 1; }else if(this.searchhead == (num - 1)){ this.searchhead = 0; } } },
原來,getElementsByTagName(“a”)
返回的是帶有指定標簽名的對象的集合。通過對數組的序列的調用就可以完成對方法的依次調用。
至此,這個簡單頁面的功能已基本實現,
源碼
<script src="../axios/axios.js"></script> <template> <div> <div class="header"> <div class="search-total"> <div class="search_model_zt"> <div class="search"> <div class="search_icon"><img :src="require('img/search.png')" /></div> <div class="search_input"><input v-model="searchitem" @keyup.enter="submit" placeholder="搜索條文" /></div> </div> </div> </div> </div> <div class="law-content"> <div id="content" v-if="datelist" v-html="changeColor(datelist.lawContent)"></div> </div> </div> </template> <script> require('../utils/js/jquery.min.js'); export default { data() { return { datelist: null, searchitem: '', searchnum:null, searchhead:0, }; }, created() { this.datelist = JSON.parse(sessionStorage.getItem('lawcontent')) console.log(this.datelist.lawTypeName) }, methods: { changeColor(item) { let searchitem = this.searchitem; console.log(this.datelist.lawTypeName); if (searchitem !== '') { return item.replace(new RegExp(searchitem, 'g'), '<a id="seach" >' + searchitem + '</a>'); } else { return item; } }, submit(){ let num = document.getElementsByTagName("a").length; //獲取所有a標簽的數量,這個頁面所有的a標簽都是由查詢替換獲得的,所以a標簽的數量可以當場查詢到關鍵詞的數量 if(num != 0){ //如果查詢關鍵詞存在,跳到第一個關鍵詞的位置,標頭增1,走滿一圈歸0 document.getElementsByTagName("a")[this.searchhead].scrollIntoView(); //scrollIntoView方法只在原生document中可以使用,jquery中沒有這個方法,參數默認是true,將這個元素置于頁面第一行(如果頁面可以滑動函數才生效) if(this.searchhead < (num - 1)){ this.searchhead += 1; }else if(this.searchhead == (num - 1)){ this.searchhead = 0; } }else{ } }, } }; </script> <style scoped> #content { white-space: pre-line; } .header { width: 100%; top: 0px; background: white; padding: 8px 8px; border-bottom: 2px solid #f5f5f5; } .search-total { width: 100%; height: auto; } .search_model_zt { height: 35px; background: #fff; } .search { width: 100%; /* margin: auto; */ border-radius: 30px; background-color: #f3f3f3; height: 32px; position: relative; } .search_icon { position: absolute; left: 5%; top: 7px; width: 16px; height: 16px; } .search_icon img { width: 100%; height: 100%; } .search_input { margin-left: 14%; } .search_input input { background: none; border: none; height: 34px; width: 100%; } input { outline: none; border: 0; background: none; font-size: 0.9rem; } .law-content { width: 100%; height: calc(100% - 95px); padding: 27px 18px 40px 16px; position: fixed; overflow: auto; } .law-content div { color: rgba(85, 85, 85, 1); font-size: 14px; } </style>
看完上述內容,你們掌握怎么在vue項目中實現一個ctrl+f搜索功能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。