0
点赞
收藏
分享

微信扫一扫

用js简单做一个模糊搜索的效果

暮晨夜雪 2021-09-25 阅读 50

使用百度搜索时,每当输入你想查询的关键词,都会出现很多与关键词相近的选项方便你快速查询,今天,就来生成一个自己写的简单的模糊搜索的效果。
首先,最初的写入判断,然后分为两部分,鼠标事件和键盘事件。

var index = 0;
//输入框输入事件
input.oninput = function () {
    //使用trim方法去掉写入的value值中的前后空格
    var input_value = input.value.trim();
    //设置一个空数组,在其中第一项放置一个空字符串,为了避免在键盘光标点击事件中,出现的光标移动下标递增至第二项的问题
    var arr = [''],
        str = '';
    for (var i = 1; i < data.length; i++) {
        //使写入的value的值不为空,而且写入的value值在数组中可以找到时
        if (data[i].indexOf(input_value) !== -1 && input_value !== '') {
            //将该数组中的数据使用push方法写入到新数组中
            arr.push(data[i]);

        }
    }
    for (var i in arr) {
        str += `<p>${arr[i]}</p>`
        //遍历每项,将相关的写入到页面中
    }
    if (arr.length > 0) {
        //当检测到关键词,新数组中有值时,页面内容出现
        content.style.cssText = `display:block`
    } else {
        //否则消失
        content.style.cssText = `display:none`
    }
    content.innerHTML = str;

设置好对写入的值的筛选后,开始设置鼠标事件

var p = document.querySelectorAll('p')
    for (var i = 1; i < p.length; i++) {
        p[i].ind = i;
        //鼠标移动事件
        p[i].onmouseover = function () {
            for (var j = 0; j < p.length; j++) {
                //使用排他思想,将其他项的背景颜色清除
                p[j].style.cssText = `background:none`
            }
            //移动到提示内容中的每一项时,背景颜色发生变化
            p[this.ind].style.cssText = `background:blue`
            // index = this.ind
        }
    }

设置键盘事件:

 window.onkeydown = function (e) {
        e = window.event || e.event;
        var p = document.querySelectorAll('p')
        if (e.keyCode == 38) {
            //当点击向上光标时
            index--
            if (index < 1) {
                index = p.length - 1
                //如果下标小于1时(第0项是空字符串),下标跳转到最后一项
            }
            for (var j = 0; j < p.length; j++) {
                p[j].style.cssText = `background:none`
            }
            //光标移动到该下标时,设置一个背景颜色变化的事件
            p[index].style.cssText = `background:blue`
            input.value = p[this.index].innerHTML
        } else if (e.keyCode == 40) {
             //当点击向下光标时
            index++
            if (index > p.length - 1) {
                index = 1
                //如果下标大于最后一项时(第0项是空字符串),下标跳转到1
            }
            for (var j = 0; j < p.length; j++) {
                p[j].style.cssText = `background:none`
            }
            p[index].style.cssText = `background:blue`
            input.value = p[this.index].innerHTML
        }
    }

设置一个点击下方搜索框的每项时,直接将该项写入到input框中的事件

for (var i = 1; i < p.length; i++) {
        p[i].ind = i;
        p[i].onclick = function () {
            p[this.ind].style.cssText = `background:blue`;
            index = this.ind;
            input.value = p[this.ind].innerHTML
            //点击时,将点击的一项写入到当前的input框中
        }
    }

最后设置一个点击其他位置,下方的关键字搜索框消失的事件

 window.onclick = function (e) {
        e = window.event || e.event;
        if (e.target.nodeName !== 'INPUT') {
            //设置一个window的点击事件,除了点击到input框中时,下方的搜索结果不消失,随意点击每处位置,下方的搜索结果框都消失.
            content.style.cssText = `display:none`;
        }
    }

完整代码:

data = [
    '被门夹过的核桃还能补脑吗',
    '被门夹过的脑袋吃核桃还补得回来吗',
    '被门夹过的脑袋吃被门夹过的核桃有用吗',
    '买了核桃吃了不补脑能找卖核桃的赔钱吗',
    '核桃一次性吃太多吃吐了还有用吗',
    '爱因斯坦爱吃核桃吗',
    '傻人吃了核桃变聪明了还能有傻福吗',
    '吃了核桃的人致死率高达100%吗'
]
var input = document.querySelector('input');
var content = document.querySelector('#content');

var index = 0;
//输入框输入事件
input.oninput = function () {
    //使用trim方法去掉写入的value值中的前后空格
    var input_value = input.value.trim();
    //设置一个空数组,在其中第一项放置一个空字符串,为了避免在键盘光标点击事件中,出现的光标移动下标递增至第二项的问题
    var arr = [''],
        str = '';
    for (var i = 1; i < data.length; i++) {
        //使写入的value的值不为空,而且写入的value值在数组中可以找到时
        if (data[i].indexOf(input_value) !== -1 && input_value !== '') {
            //将该数组中的数据使用push方法写入到新数组中
            arr.push(data[i]);

        }
    }
    for (var i in arr) {
        str += `<p>${arr[i]}</p>`
        //遍历每项,将相关的写入到页面中
    }
    if (arr.length > 0) {
        //当检测到关键词,新数组中有值时,页面内容出现
        content.style.cssText = `display:block`
    } else {
        //否则消失
        content.style.cssText = `display:none`
    }
    content.innerHTML = str;
    var p = document.querySelectorAll('p')
    for (var i = 1; i < p.length; i++) {
        p[i].ind = i;
        //鼠标移动事件
        p[i].onmouseover = function () {
            for (var j = 0; j < p.length; j++) {
                //使用排他思想,将其他项的背景颜色清除
                p[j].style.cssText = `background:none`
            }
            //移动到提示内容中的每一项时,背景颜色发生变化
            p[this.ind].style.cssText = `background:blue`
            // index = this.ind
        }
    }
    //键盘事件
    window.onkeydown = function (e) {
        e = window.event || e.event;
        var p = document.querySelectorAll('p')
        if (e.keyCode == 38) {
            //当点击向上光标时
            index--
            if (index < 1) {
                index = p.length - 1
                //如果下标小于1时(第0项是空字符串),下标跳转到最后一项
            }
            for (var j = 0; j < p.length; j++) {
                p[j].style.cssText = `background:none`
            }
            //光标移动到该下标时,设置一个背景颜色变化的事件
            p[index].style.cssText = `background:blue`
            input.value = p[this.index].innerHTML
        } else if (e.keyCode == 40) {
             //当点击向下光标时
            index++
            if (index > p.length - 1) {
                index = 1
                //如果下标大于最后一项时(第0项是空字符串),下标跳转到1
            }
            for (var j = 0; j < p.length; j++) {
                p[j].style.cssText = `background:none`
            }
            p[index].style.cssText = `background:blue`
            input.value = p[this.index].innerHTML
        }
    }
    for (var i = 1; i < p.length; i++) {
        p[i].ind = i;
        p[i].onclick = function () {
            p[this.ind].style.cssText = `background:blue`;
            index = this.ind;
            input.value = p[this.ind].innerHTML
            //点击时,将点击的一项写入到当前的input框中
        }
    }
    window.onclick = function (e) {
        e = window.event || e.event;
        if (e.target.nodeName !== 'INPUT') {
            //设置一个window的点击事件,除了点击到input框中时,下方的搜索结果不消失,随意点击每处位置,下方的搜索结果框都消失.
            content.style.cssText = `display:none`;
        }
    }
}
举报

相关推荐

0 条评论