function queryStr(str, query) {
let result
const index = str.indexOf(query)
if (index !== -1) {
result = `${str.substr(0, index)}<span style="color: red;">${query}</span>${str.substr(index + query.length)}`
} else {
result = str
}
return result
}
queryStr('hello world', 'r')
发布评论
评论(25)
应用用节流还是防抖?
debounce不是防抖么?
mark一下,这个问题真的有意思
处理中文输入,再加个防抖。如果用数据驱动视图,可以“原地复用”,才是最优解。
v-html的xss攻击这样这样解决?
厉害,但是有点就是我看到实现的debounce是防抖,确实是使用防抖不能使用节流,只是最上面的文案是要修改一手。赞
let list = [
{
id: 1,
address: '上海野生动物园'
},
{
id: 2,
address: '上饶野生动物园'
},
{
id: 3,
address: '北京巷子'
},
{
id: 4,
address: '上海中心'
},
{
id: 5,
address: '上海黄埔江'
},
{
id: 6,
address: '迪士尼上海'
},
{
id: 7,
address: '陆家嘴上海中心'
},
]
const input1 = document.querySelector('#input1');
const ul = document.querySelector('ul');
input1.addEventListener('keyup', debounceFunc(function() {
const result = getResult(this.target.value);
renderUl(result);
}, 500))
function a(str, childStr){
const arr = str.split(childStr)
return arr.join(
<span class="highlight">${childStr}</span>
)}
这不是防抖吗? @lhyt
结合输入中文:compisitionsart compositionend
let panter = new RegExp(关键词, 'ig')
replace(panter, matchValue =>
<span style="xxx">${matchValue}</span>
);正则忽略大小写,然后replace第二个参数用函数更佳哈
在这里我有个问题,如果是富文本编辑器返回的内容,如何高亮选中,然后后端怎么在查找的时候,帅选掉那些标签呢
'变蓝变红变绿变蓝变'.match(/(变蓝)|((?!变蓝).)+/g)
React 版本
个人网站在我看到此题前实现了一个,为纯英文时,需要注意不区分大小写.返回值通过vue v-html渲染
搜索支持简单布尔运算
用关键词去切分搜索结果为3段
export const keyWordHeightLight = (item, value) => {
const mIdx = item.indexOf(value)
const first = mIdx >= 0 ? mIdx : item.length
const second = value.length
let _head = item.substr(0, first)
let _heightLight = item.substr(first, second)
let _foot = item.substr(second + mIdx, item.length)
return _head +
<b>${_heightLight}</b>
+ _foot}
new RegExp 要注意排除有正则含义的字符,比如用户输入
^ $
等。直接把 输入的字符 变蓝, 服务端返回的数据 把输入字符替换掉,然后追加后面那部分 显示。
没有结果的时候做一下判断。
实现不难,写一个pipe做统一的转换会让代码看起来更加简洁
我的大概思路是,用正则替换掉关键词。
ps:如果是vue项目,直接与v-html结合使用更爽哦~
考虑节流、缓存。其实还可以上列表diff+定时清理缓存