美文网首页前端
用js简单做一个模糊搜索的效果

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

作者: 光年之外iii | 来源:发表于2019-10-27 19:54 被阅读0次

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

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`;
        }
    }
}

相关文章

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

    使用百度搜索时,每当输入你想查询的关键词,都会出现很多与关键词相近的选项方便你快速查询,今天,就来生成一个自己写的...

  • js:模糊搜索

    //模糊搜索开始 var sFind = document.getElementById("show").valu...

  • 17.canvas 高斯模糊封装

    原文:js canvas画布实现高斯模糊效果 我们先不分析这个源码的具体内容,我们先简单改一下接口. 发现模糊效果...

  • 前端js模糊搜索(模糊查询)

    1.html结构: 查询结果放ul里面 2.css样式: 查询结果对应的显示框css 列表都是li组成css 这个...

  • vue模糊查询插件fuse.js的使用

    Fuse.js是一个功能强大、轻量级的模糊搜索库,没有依赖关系。简单使用步骤如下: 安装fuse.js插件。 在v...

  • js 正则做模糊搜索

    js 正则做模糊搜索 网上搜了一下大多数的教程都是使用 indexof 循环来查询,总感觉有点累赘。 下面是使用正...

  • js 实现本地模糊搜索

    前端实现模糊搜索 indexOf、split 、match、test indexOf方法 语法:stringObj...

  • 用UITextField做模糊搜索

    背景 在项目中有一个界面需要选择银行,可是银行太多,用tableview下拉查找的话不方便用户使用,故需要实现在U...

  • 搜索

    用search可以进行搜索用toLowerCase可以忽略大小写用split可以进行模糊搜索

  • js实现模糊搜索(vue组件)

    平时的搜索功能都是基于后台交互,拿数据就好。前几日碰到了需要使用本地数据匹配模糊搜索的功能,重新封了一个vue小组...

网友评论

    本文标题:用js简单做一个模糊搜索的效果

    本文链接:https://www.haomeiwen.com/subject/hnlmvctx.html