最近在作微信小程序的時候,須要實如今搜索框的輸入內容的時候實現全局匹配實現高亮效果,目前的思路是,遞歸後臺來返回的數據,並將對象的value值替換爲須要的dom節點,而且經過rich-text來實現,高亮效果。node
在實現的過程當中主要考慮,不一樣類型的數據結構,過濾掉特殊符號,url這些基本需求;同時在實現的過程當中每次都要去處理最原始的數據,這就須要考慮到對象的深拷貝問題,目前所採用的方法是經過JSON.parse(JSON.stringify(str))來處理,由於在這個全局搜索的項目中不太會用到函數這些對象。最後經過replace方法來處理這些目標字符串。json
wxml:小程序
<view class='homePage'> <input bindinput="bindKeyInput"></input> <view wx:for="{{newJson}}" wx:for-item='item' wx:key> <rich-text nodes="{{item.name}}"></rich-text> <rich-text nodes="{{item.address}}"></rich-text> <rich-text nodes="{{item.age}}"></rich-text> <view wx:if="{{item.aihao}}" wx:for="{{item.aihao}}" wx:for-item='sitem' wx:key> <rich-text nodes="{{sitem}}"></rich-text> </view> </view> </view>
js:微信小程序
//index.js //index.js const app = getApp() Page({ data: { homeUrl: '../index/index', mineUrl: '../mine/mine', newFillUrl: '../newFill/newFill', historyUrl: '../historyData/historyData', json: [{ name: '你是誰', age: 'awdqww\\k', address: 'auemnkjkifwh{\\efwfheffoewjowef', aihao: ['sdsd', 'sdfsd', 'sdsf'] }, { name: '98797', age: '6544656', address: 'https://www.baidu.com/' }], newJson: '', tempText: '', showShadow: false, chartNumber: 0, newStr:'' }, /** * 生命週期函數--監聽頁面加載 */ onLoad: function (options) { this.setData({ newJson: this.data.json }) }, haha: function () { console.log('haha'); wx.navigateTo({ url: '../mine/mine', }) }, digui: function (newJson, obj, key) { var urlReg = new RegExp('(https ?|ftp | file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]') var that = this; var reg = that.data.tempText; if (that.data.tempText == '.' || that.data.tempText == '\\' || that.data.tempText == '\?' || that.data.tempText == '\[' || that.data.tempText == '\]') { reg = '\\' + that.data.tempText } var reg = new RegExp(reg, 'ig'); if (newJson.constructor == Array) { newJson.forEach(function (item, index) { if (item.constructor == String && !urlReg.test(item)) { obj[key].splice(index, 1, item.replace(reg, function (index) { if (that.data.newStr != ''){ that.setData({ chartNumber: (that.data.chartNumber + 1) }) } return "<span style='color:red'>" + that.data.tempText + "</span>" })) } else { that.digui(item, newJson); } }); } else if (newJson.constructor == Object) { var json = {}; for (var key in newJson) { json[key] = newJson; that.digui(newJson[key], newJson, key); } } else if (newJson.constructor == String && !urlReg.test(newJson)) { // 這裏作全局替換 if (key) { obj[key] = newJson.replace(reg, function () { if (that.data.newStr != '') { that.setData({ chartNumber: (that.data.chartNumber + 1) }) } return "<span style='color:red'>" + that.data.tempText + "</span>" }) } } }, showBgShadow: function (e) { this.setData({ showShadow: e.detail.showBgShadow }) }, bindKeyInput: function (e) { var regChart = this.data.regChart; var text = e.detail.value; var newStr = ''; newStr = text.replace(/[\@\#\$\%\^\&\*\{\}\:\"\L\<\>\?\\\.]/, '') this.setData({ tempText: newStr, chartNumber: 0, newStr: newStr }) var newJson = JSON.parse(JSON.stringify(this.data.json)); this.digui(newJson); this.setData({ newJson: newJson }) } })