用jQuery實現搜索框的過濾效果


遇到的問題:

1.動態添加了某些元素,在動態添加的某個元素上綁定事件失效

原因:因為需要綁定的元素的直接父元素也是動態添加的
解決:向上為上一級父元素綁定事件

$(".check-box").on('click','i',function(){//在check-value上動態添加無效,因為check-value也是動態添加上的 
  $(this).parent().remove();
});

 

2.多選框判斷是否選中,方法無效

原因:判斷錢必須先為其綁定點擊事件

$(".total").click(function(){//必須為多選按鈕綁定點擊事件才能判斷
  if($(this).is(':checked')){
    filterObj.attr('disabled','disabled');
  }else{
    filterObj.removeAttr('disabled');
}
});


3.事件阻止冒泡問題(多少次了還是不會...)

-- 搜索框綁定點擊事件
-- 彈出搜索列表;
-- 為document綁定一次性點擊事件,隱藏搜索列表;
-- 阻止事件流
-- 為搜索列表綁定點擊事件
-- 阻止事件流

filterObj.on('click',function(e){//點擊搜索框,彈出
  selectObj.css("display","block");
  $(document).one("click", function(){
    selectObj.css("display","none");
  });
  e.stopPropagation();
});
selectObj.on("click", function(e){
  e.stopPropagation();
});

效果圖大概如下:

附上完整代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用jquery實現搜索框的過濾效果</title>
    <style>
        .wrap{
            overflow: hidden;
        }
        .wrap p{
            float:left;
            margin-top: 220px;
        }
        label{
            margin-left: 100px;
        }
        .box{
            float:left;
            position: relative;
            width:500px;
            height:240px;
            margin-left:30px;
        }
        .select-list{
            position: absolute;
            left:0;
            bottom:40px;
            display: none;
            margin:0;
            padding:0;
            width:500px;
            border: 1px solid grey;
            list-style: none;
            border-bottom:0;
        }
        .select-list li{
            padding: 7px 10px;
        }
        .active{
            background-color: #f5f5f5;
        }
        .filter-box{
            position: absolute;
            bottom:0;
            left:0;
            width:100%;
            height:40px;
            border-radius: 3px;
            border: 1px solid grey;
        }
        .check-box{
            display: inline-block;
            float:left;
            margin-left: 10px;
        }
        .check-value{
            display: inline-block;
            margin-top: 5px;
            height:30px;
            width:60px;
            line-height: 30px;
            font-size: 14px;
            margin-right: 10px;
            border-radius: 3px;
            border: 1px solid grey;
            background-color: #f5f5f5;
        }
        i{
            margin-right:10px;
            cursor: pointer;
        }
        .filter{
            float:left;
            min-width: 16px;
            height:36px;
            padding-left: 10px;
            outline: none;
            border: none;
        }
        input:disabled{
            background-color: #F5F5F5;
        }
    </style>
</head>
<body>
<div class="wrap">
    <p>人員: <label><input type="checkbox" value="all" class="total" name="all">全選</label></p>

    <div class="box">
        <ul class="select-list">
            <li>12</li>
            <li>ee</li>
            <li>52</li>
            <li>6882</li>
            <li>6882</li>
            <li>aaa</li>
        </ul>
        <div class="filter-box">
            <span class="check-box"></span>
            <input type="text" class="filter">
        </div>
    </div>
</div>

</body>
<script src="jquery-1.11.3.min.js"></script>
<script>
    $(document).ready(function(){
        var filterObj = $(".filter");
        var selectObj = $(".select-list");
        var index;
        fun();
        function fun(){
            //點擊搜索框,彈出列表
            filterObj.on('click',function(e){//點擊搜索框,彈出
                selectObj.css("display","block").find("li").css("display","block");
                $(document).one("click", function(){
                    selectObj.css("display","none");
                });
                e.stopPropagation();//阻止綁定在filterObj上的事件傳播到其他節點
            });
            selectObj.on("click", function(e){
                e.stopPropagation();//阻止綁定在selectObj上的事件傳播到其他節點
            });

            //點擊列表中的值,添加到搜索框中
            selectObj.find("li").click(function(){
                index = $(".select-list li").index(this);
                filterObj.val("").focus();
                if($(this).attr('class')!='active'){
                    $(this).addClass('active');
                    $(".check-box").css("display","block");
                    $("<span class='check-value'/>").appendTo(".check-box");
                    $("<i/>").html('×').attr('id',index).appendTo(".check-value:last");
                    $("<span/>").html($(this).html()).appendTo(".check-value:last");
                }
            });
            //點擊x刪除對應的值
            $(".check-box").on('click','i',function(){//在check-value上動態添加無效,因為check-value也是動態添加上的
                index = $(this).attr("id");
                selectObj.find("li").eq(index).removeClass('active');
                $(this).parent().remove();
            });

            //過濾功能
            //讓jQuery的contains方法不區分大小寫
            jQuery.expr[':'].Contains = function(a,i,m){
                return (a.textContent || a.innerText|| a.innerHTML || "").toUpperCase().indexOf(m[3].toUpperCase())>=0;
            };
            //搜索框文字一旦改變就匹配查找
            $(".filter")
                    .change( function () {
                        var filterVal = $(this).val();
                        if(filterVal) {
                            $matches = $(selectObj).find('li:Contains(' + filterVal + ')');
                            $('li', selectObj).not($matches).slideUp();
                            $matches.slideDown();

                        } else {
                            selectObj.css("display","block").find("li").css("display","block");
                        }

                        return false;
                    })
                    .keyup( function () {
                        $(this).change();
                    });

        }

        //全選后,禁用input,隱藏列表

        $(".total").click(function(){//必須為多選按鈕綁定點擊事件才能判斷
            if($(this).is(':checked')){
                filterObj.val("").attr('disabled','disabled');
                $(".filter-box").css("backgroundColor","#f5f5f5");
                $(".check-box").off('click','i');
                $(".check-box").empty();
            }else{
                filterObj.removeAttr('disabled');
                $(".filter-box").css("backgroundColor","");
                selectObj.find("li").removeClass('active');
               fun();
            }
        });
    });
</script>
</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM