JS模擬瀏覽器實(shí)現(xiàn)全局搜索功能
需要像瀏覽器的全局搜索一樣,搜索指定模塊的對應(yīng)值,然后將匹配到的內(nèi)容添加背景顏色等。
思路
- 需要取到當(dāng)前指定區(qū)域的所有內(nèi)容
- 然后在取到的內(nèi)容中找到搜索的內(nèi)容加上對應(yīng)的背景顏色
- 最后在將修改后的內(nèi)容渲染到頁面上
實(shí)現(xiàn)
- 利用innerHTML取到對應(yīng)模塊的內(nèi)容
- 編寫對應(yīng)的正則表達(dá)式來匹配搜索的內(nèi)容
- 利用String.prototype.replace替換匹配到的內(nèi)容
- 最后在渲染到頁面上
代碼實(shí)現(xiàn):
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;
具體的實(shí)現(xiàn)搜索實(shí)現(xiàn)就完成了,但是上面代碼還有個(gè)缺陷,就是更換搜索內(nèi)容時(shí),之前搜索的內(nèi)容還是具有選中的樣式,那么接下來完善功能:
let preQuery = ''; // 上一次搜索的內(nèi)容 let wrapDom = ''; // 搜索區(qū)域的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; }
至此搜索高亮的功能就已經(jīng)實(shí)現(xiàn)了。
注意事項(xiàng)
搜索區(qū)域的dom元素中不能使用title屬性,因?yàn)楫?dāng)使用title屬性時(shí)也會把對應(yīng)的title屬性內(nèi)容替換,頁面渲染時(shí)就會產(chǎn)生問題,其實(shí)可以將匹配規(guī)則的正則表達(dá)式重寫,但是能力有限,不知道如何編寫排除title屬性的正則表達(dá)式
如果使用Vue等框架編寫時(shí),搜索完之后vue相關(guān)的事件和屬性全都失效了,因?yàn)槲覀冞@樣是直接把dom給換了,這種情況下有兩種解決方法:
搜索完成之后,再實(shí)例化一次vue
function resetVm() { vm.destroy() vm = new Vue({...}) }
但是這樣會有個(gè)問題,重新實(shí)例化vue實(shí)例之后,搜索內(nèi)容就沒了
不使用vue,可以用jQuery去實(shí)現(xiàn)頁面,這樣就不會有事件失效的問題
總結(jié)
以上所述是小編給大家介紹的JS模擬瀏覽器實(shí)現(xiàn)全局搜索功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
關(guān)于arguments,callee,caller等的測試
關(guān)于arguments,callee,caller等的測試...2006-12-12select隱藏選中值對應(yīng)的id,顯示其它id的簡單實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猻elect隱藏選中值對應(yīng)的id,顯示其它id的簡單實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08Canvas實(shí)現(xiàn)數(shù)字雨和放大鏡效果的代碼示例
這篇文章主要介紹了如何Canvas實(shí)現(xiàn)數(shù)字雨和放大鏡效果,文中有完整的代碼示例,文章通過代碼介紹的非常清楚,感興趣的小伙伴跟著小編一起來看看吧2023-07-07JS+Canvas繪制動(dòng)態(tài)時(shí)鐘效果
這篇文章主要為大家詳細(xì)介紹了JS+Canvas繪制動(dòng)態(tài)時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11