JQ搜索匹配,选择关键词加入(类似加入购物车功能)

436 阅读3分钟

页面逻辑分析:

1、1,2,3类关键词tab切换

2、当点击关键词时,要将该关键词ID保存到一个数组中(提交后台),文字要展示到页面上去,类似加入购物车

3、点击删除按钮可以从已选关键词删除,删除数组中关键词ID和页面展示的文字内容

4、点击下一步跳转购买页面,通过form表单,将数据拼接到url进行传递,后台根据url参数渲染数据

1、关键词切换

//页面结构:大致就是这样
<ul class="nav">
    <li class="active">一类关键词</li>
    <li>二类关键词</li>
    <li>三类关键词</li>
</ul>
<ul class="wrap">
    <li class="list">一类关键词默认显示</li>
    <li class="list" style="display:none;">二类关键词显示</li>
    <li class="list" style="display:none;">三类关键词显示</li>
</ul>
//1,2,3类关键tab切换
//给ul上的li绑定点击事件,获取到当前点击的index
$('.nav').on('click','li',function(event){
    var index = $(this).index();
    $(".nav li").eq(index).addClass("active").siblings().removeClass("active");//li高亮切换
    $(".wrap .list").eq(index).addClass("show").siblings().removeClass("show");//对应的盒子显示
});

2、点击关键词保存ID页面展示文字内容

//点击关键词,加入已选关键词容器
var codeArr=[];//所有已选关键词的ID存入codeArr
var Dom = $('#js-key-wrap');//需要追加到页面的位置
var html='';//页面展示文字拼接

//.get-key li就是所有关键词,这里可以拿到自定义属性data-id关键词ID,和点击的文本
$('.get-key li').click(function(event){
    var code = this.getAttribute('data-id');//关键词id
    var text = event.target.innerText;//关键词,页面展示
    
    //如果codeArr.length>0说明此时已经存有关键词,防止重复添加这里需要进行判断   
    if(codeArr.length>0){
        //判断当前点击项id是否和数组中的id相等,
        for(var i=0;i<codeArr.length;i++){
           if(code == codeArr[i]){
               return false;
           }
       }
       //如果不相等则正常存id,将拼好的html追加到页面Dom位置
       codeArr.push(code)//关键字ID存入数组
       html = '<li data-id="'+code+'"><span>'+ text +'</span><i>×</i></li>'//页面展示已选关键词
       Dom.append(html);//追加到页面
      
    }else{
        //第一次点击关键词,直接存入
        codeArr.push(code)
        html = '<li data-id="'+code+'"><span>'+ text +'</span><i>×</i></li>'
        Dom.append(html);
        $('#js-key').css({//已选关键词盒子显示。
            'position':'fixed',
            'display':'block'
        })
    }
});

3、删除已选关键词

//为已选关键词 i添加点击事件,i标签是×号
$('#js-key-wrap').on('click','li i',function(event){
    $(this).parents('li').remove(); // 从页面删除当前点击的父元素li
    for(var i=0;i<codeArr.length;i++){
        //判断当前点击的id和codeArr数组中第[i]项id是否相等
        if($(this).parents('li').data("id") == codeArr[i]){
            codeArr.splice(i, 1); //删除当前项
        }
    }
    //如果全部删除,关键词盒子隐藏
    if(codeArr.length == 0){
        $('#js-key').css({
            'position':'fixed',
            'display':'none'
        })
    }
})

4、点击下一步form标签跳转到购买页面,并将已选关键词id拼接到URL上

//html部分:
<form action="../keywords/buy_key.html" method="get">
    <input type="text" name="key_code" id="key_code" value="" hidden />
    <input class="submit js-submit" type="submit" value="下一步">
</form>

$('.js-submit').click(function(){
    $('#key_code').val(codeArr);//数组中id赋值给id="key_code"
})

搜索逻辑分析:

1、页面引入bootstrap-typeahead.js文本能自动补全插件

2、定义一个对象obj用于存储1,2,3类关键词

3、搜索关键词逻辑部分

4、用户点击搜索和回车搜索

1、bootstrap-typeahead.js插件使用引入,需要引入JQ

<script src="../../js/common/jquery-3.2.1.min.js"></script>
<script src="../../js/common/bootstrap-typeahead.min.js"></script>

var keywordData = [];//页面所有分类数据,存入数组,用于数据匹配
//将所有li的文本内容存入keywordData
$('.js-get-key li').each(function(index,val){
    keywordData.push($(val).text())
    //['关键词1','关键词2','关键词3']
})
function parseLocalArrayData() {
    $("#keyval").typeahead({
        source: keywordData, //数据源
        items: 8, //最多显示个数
        delay: 500 //延迟时间
    });
}
parseLocalArrayData()//执行该事件

//页面使用
<input id="keyval" autocomplete="off" data-provide="typeahead" type="text" placeholder="请输入">
<button class="btn1 g-fl js-key-search">搜索</button>

2、定义对象,存储关键词

var obj ={
    class1:[],//1类
    class2:[],//2类
    class3:[],//3类
}
var class1 = $('#class1 .js-get-key li');//获取1类关键词,将id和文本存入obj.class1
class1.each(function(index,val){
    var key1={
        id:class1[index].dataset.id,
        text:class1[index].innerText,
    }
    obj.class1.push(key1)
})
var class2 = $('#class2 .js-get-key li');//获取2类关键词,将id和文本存入obj.class2
class2.each(function(index,val){
    var key2={
        id:class2[index].dataset.id,
        text:class2[index].innerText,
    }
    obj.class2.push(key2)
})
var class3 = $('#class3 .js-get-key li');//获取2类关键词,将id和文本存入obj.class3
class3.each(function(index,val){
    var key3={
        id:class3[index].dataset.id,
        text:class3[index].innerText,
    }
})
obj.class3.push(key3)
//得到数据如下格式:
obj{
    class1:[
        {
            id:1,
            text:'关键词1',
        },
        {
            id:2,
            text:'关键词2',
        }
    ],
}

3、搜索逻辑部分,

function search_key (){
        var key_val = $('#keyval').val();//搜索值
        if (key_val == '') {
            layer.msg('请输入搜索内容')
        }else if(keywordData.indexOf(key_val) == -1){//如果关键词数组keywordData中没有key_val关键词则会返回-1
            layer.msg('暂无该关键词')
        } else {
            console.log('搜索成功');
            //obj_1存储被搜索到的关键字
            var obj_1 = {
                class_1:null,
                id:'',
                text:'',
            }
            $(obj.class1).each(function(index,val){  //循环1类数据
                if(val.text == key_val){             //关键词与输入的搜索关键词相同
                    $(".nav li").eq(0).addClass("active").siblings().removeClass("active");//当前1类高亮
                    $(".wrap .list").eq(0).addClass("show").siblings().removeClass("show");//显示1类模块
                    var dom = $('#class1 .item li[data-id='+val.id+']');//获取关键词所在页面位置
                    $('html , body').animate({  //设置页面平滑滚动到该关键词
                        scrollTop: dom[0].offsetTop -200
                    }, '500',function(){
                        setTimeout(function(){
                            dom.addClass('scarv');//滚动过后添加类名,缩放动画
                        },'100')
                        setTimeout(function(){
                            dom.removeClass('scarv')//删除动画
                        },'1000')
                    });
                    obj_1.class_1 = 1;      //关键词1类
                    obj_1.id = val.id;      //搜索的关键词ID
                    obj_1.text = val.text;  //搜索的关键词
                    return false;
                }
            })
            
            $(obj.class2).each(function(index,val){
                if(obj_1.class_1){//如果obj_1.class_1已经存在,说明已经搜索到,就停止搜索
                    return false;
                }else{
                    if(val.text == key_val){
                        $(".nav li").eq(1).addClass("active").siblings().removeClass("active");
                        $(".wrap .list").eq(1).addClass("show").siblings().removeClass("show");
                        var dom = $('#class2 .item li[data-id='+val.id+']');
                        $('html , body').animate({
                            scrollTop: dom[0].offsetTop -200
                        }, '500',function(){
                            setTimeout(function(){
                                dom.addClass('scarv');
                                
                            },'100')
                            setTimeout(function(){
                                dom.removeClass('scarv')
                            },'1000')
                            
                        });
                        obj_1.class_1 = 2;
                        obj_1.id = val.id;
                        obj_1.text = val.text;
                        return false;
                    }
                }
            })
            
            $(obj.class3).each(function(index,val){
                if(obj_1.class_1){
                    return false;//如果obj_1.class_1已经存在,说明已经搜索到,就停止搜索
                }else{
                    if(val.text == key_val){
                        $(".nav li").eq(2).addClass("active").siblings().removeClass("active");
                        $(".wrap .list").eq(2).addClass("show").siblings().removeClass("show");
                        var dom = $('#class3 .item li[data-id='+val.id+']');
                        $('html , body').animate({
                            scrollTop: dom[0].offsetTop -200
                        }, '500',function(){
                            setTimeout(function(){
                                dom.addClass('scarv');
                                
                            },'100')
                            setTimeout(function(){
                                dom.removeClass('scarv')
                            },'1000')
                            
                        });
                        obj_1.class_1 = 3;
                        obj_1.id = val.id;
                        obj_1.text = val.text;
                        return false;
                    }
                }
            })
        }
    }

4、点击搜索和回车搜索

//判搜索框输入的值
$(".js-key-search").click(function() {
    search_key();
});


//用户搜索关键词回车事件
if($('.js-key-search').length > 0){
    document.onkeydown=function(ev){
        var event=ev ||event
        if(event.keyCode==13){
            search_key();
        }
    };
}

//点击热门关键词搜索
$('.js-hot-key').on('click','li',function(){
    var text = $(this)[0].innerText;//获取当前点击的文字内容
    $('#keyval').val(text)//将文字内容赋值给输入框
    $('.js-key-search').trigger('click');//触发搜索事件
})