jQuery:在blur()事件之前触发click()

时间:2012-05-18 12:41:50

标签: jquery click onblur

我有一个输入字段,我尝试制作自动填充建议。代码看起来像

<input type="text" id="myinput">
<div id="myresults"></div>

在输入的blur()事件中,我想隐藏结果'div:

$("#myinput").live('blur',function(){
     $("#myresults").hide();
});

当我在输入中写入内容时,我向服务器发送请求并获取json响应,将其解析为ul-&gt; li结构并将此ul放到我的#myresults div中。

当我点击这个解析后的li元素时,我想将li中的值设置为输入并隐藏#myresults div

$("#myresults ul li").live('click',function(){
     $("#myinput").val($(this).html());
     $("#myresults").hide();
});

一切都很顺利,但是当我点击我的blur()事件时,click()之前的事件发生,并且输入的值不会得到li的html。

如何在click()之前设置blur()事件?

5 个答案:

答案 0 :(得分:275)

解决方案1 ​​

倾听mousedown而不是click

当您按下鼠标按钮时,mousedownblur事件会一个接一个地发生,但click仅在您释放它时发生。

解决方案2

您可以preventDefault() mousedown阻止下拉线窃取焦点。轻微的优点是,当释放鼠标按钮时将选择该值,这是本机选择组件的工作方式。 JSFiddle

$('input').on('focus', function() {
    $('ul').show();
}).on('blur', function() {
    $('ul').hide();
});

$('ul').on('mousedown', function(event) {
    event.preventDefault();
}).on('click', 'li', function() {
    $('input').val(this.textContent).blur();
});

答案 1 :(得分:2)

$(document).on('blur', "#myinput", hideResult);

$(document).on('mousedown', "#myresults ul li", function(){
     $(document).off('blur', "#myinput", hideResult); //unbind the handler before updating value
     $("#myinput").val($(this).html()).blur(); //make sure it does not have focus anymore
     hideResult(); 
     $(document).on('blur', "#myinput", hideResult);  //rebind the handler if needed
});

function hideResult() {
     $("#myresults").hide();
}

FIDDLE

答案 2 :(得分:2)

我刚刚回答了类似的问题:https://stackoverflow.com/a/46676463/227578

mousedown解决方案的另一种选择是忽略由于单击特定元素而导致的模糊事件(例如,在模糊处理程序中,如果是单击特定元素的结果则跳过执行)。

$("#myinput").live('blur',function(e){
     if (!e.relatedTarget || !$(e.relatedTarget).is("#myresults ul li")) {
         $("#myresults").hide();
     }
});

答案 3 :(得分:1)

我遇到了这个问题,使用mousedown对我来说不是一个选择。

我在处理函数

中使用setTimeout解决了这个问题
        elem1.on('blur',function(e) {

            var obj = $(this);

            // Delay to allow click to execute
            setTimeout(function () {
                if (e.type == 'blur') {

                  // Do stuff here

                }
            }, 250);
        });

        elem2.click( function() {
            console.log('Clicked');
        });

答案 4 :(得分:0)

当我点击非按钮元素时,

Mousedown解决方案对我不起作用。以下是我在代码中使用模糊函数所做的事情:

.on("blur",":text,:checkbox,:radio,select",function() {
/*
* el.container 
* container, you want detect click function on.
*/
            var outerDir = el.container.find(':hover').last();
            if (outerDir.length) {
                if ($.inArray(outerDir.prop('tagName'), ["A","SELECT"] ) != -1 || outerDir.prop('type') == 'button' || outerDir.prop('type') == 'submit') {
                    outerDir.click();
                }
                if (outerDir.prop('type') == 'checkbox') {
                    outerDir.change();
                }
                return false;
            }
/*          
* YOUR_BLUR_FUNCTION_HERE;
*/
});