下拉選擇的blur和click事件衝突了

下拉選擇的blur和click事件衝突了

當寫個下拉選擇框時我們希望當input失去焦點時,下拉框消失,或者當選擇下拉框中的內容的同時將內容填入input並且使下拉框消失。

這時候我們會想到blur和click,單獨使用的時候是沒有問題的,但一旦放到一起就會發現你點擊了下拉選項中的li時,直接觸發了blur事件,而且對li的click事件之後的判斷是否是點擊li還是僅僅input失去焦點這個判斷執行失敗了

例如

$('#productName').blur(function(){
        var chooseProduct = 0;
        $('.product-list').on('click','li',function(){
            chooseProduct = 1;
            $('#productName').val($(this).text());
            productId = $(this).data('id');
            $('#productId').val(productId);
            $('.product-list').hide();
        });

        if(chooseProduct == 1){
            console.log('執行選擇產品操作');
        }else{
            console.log('僅僅是失去焦點操作,隱藏下拉');
            $('.product-list').hide();
        }
    });

這時候你會發現chooseProduct一直是爲0的

解決方法1:

$('#productName').blur(function(){
        var chooseProduct = 0;
        $('.product-list').on('click','li',function(){
            chooseProduct = 1;
            $('#productName').val($(this).text());
            productId = $(this).data('id');
            $('#productId').val(productId);
            $('.product-list').hide();
        });
        setTimeout(function(){
            if(chooseProduct == 1){
                console.log('執行了選擇操作');
            }else{
                console.log('僅僅失去焦點,隱藏下拉');
                $('.product-list').hide();
            }
        },200)
    });

但是畢竟setTimeout還是可以感覺到延遲的

因此更好的選擇是使用mousedown

方法2:

$('#productName').blur(function(){
        var chooseProduct = 0;
        if(chooseProduct == 1){
            console.log('chooseProduct=' + chooseProduct);
        }else{
            console.log('chooseProduct=' + chooseProduct);
            $('.product-list').hide();
        }
    });

$('.product-list').on('mousedown','li',function(){
            chooseProduct = 1;
            $('#productName').val($(this).text());
            productId = $(this).data('id');
            $('#productId').val(productId);
            $('.product-list').hide();
        });

下拉效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章