Несмотря на то, что приведенный выше ответ drzone88 работает отлично, я наткнулся на один крайний случай, о котором следует упомянуть: когда вы выполняете поиск и у вас нет результатов, событие close никогда не вызывается.Тогда ваша функция размытия также никогда не будет вызвана.Поэтому я решил установить флаг, когда содержимое ответа пусто.
Мое решение также использует jquery.data (), поэтому нам не нужно перетаскивать переменную вокруг:
$( ".selector" ).autocomplete({
source: ["your values here"],
open: function(event, ui) { $(this).data("no-blur", true); },
close: function(event, ui) {
$(this).data("no-blur", false);
},
response: function(event, ui){
if(ui.content.length == 0) //when search results are empty, close is not called
$(this).data("no-blur", false);
else
$(this).data("no-blur", true); //not sure open is called again either if we re-get results
}
}).on("blur", function() {
if(!$(this).data("no-blur")) {
//do something
}
});
КакОказывается, однако, из-за порядка, в котором вызываются события, и того, что мне действительно нужно было сделать (запустить что-то при размытии, когда пользователь стирает поле без выбора опции в списке предложений), я закончилдо установки моего флага noblur в значение true в начале функции выбора и обратно в значение false в конце размытия, например, так:
$( ".selector" ).autocomplete({
source: ["your values here"],
select: function(ui, event){
$(this).data("no-blur", true);
//do select stuff
},
}).on("blur", function() {
if(!$(this).data("no-blur")) {
//do something
}
$(this).data("no-blur", false);
});
Надеюсь, это кому-нибудь поможет!