jQuery: fire click () перед событием blur ()
у меня есть поле ввода, где я пытаюсь сделать предложение автозаполнения. Код выглядит так:
<input type="text" id="myinput">
<div id="myresults"></div>
на входе blur()
событие я хочу скрыть результаты ' div:
$("#myinput").live('blur',function(){
$("#myresults").hide();
});
когда я пишу что-то в свой вход, я отправляю запрос на сервер и получаю ответ json, разбираю его в структуру ul - >li и помещаю этот ul в мой #myresults
div.
когда я нажимаю на этот разбираемый элемент li, я хочу установить значение из li для ввода и скрыть #myresults
div
$("#myresults ul li").live('click',function(){
$("#myinput").val($(this).html());
$("#myresults").hide();
});
все идет хорошо, но когда я нажимаю на мой li blur()
событие возникает перед click()
и значение ввода не получает html ли.
как я могу настроить click()
событие перед blur()
?
5 ответов:
Решение 1
слушать
mousedown
вместоclick
.The
mousedown
иblur
события происходят одно за другим при нажатии кнопки мыши, ноclick
возникает только тогда, когда вы отпустите его.решение 2
вы можете
preventDefault()
наmousedown
чтобы заблокировать выпадающий список от кражи фокуса. Небольшое преимущество заключается в том, что значение будет выбрано при отпускании кнопки мыши, что является способом работы собственных компонентов select. 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(); });
$(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(); }
Я только что ответил на аналогичный вопрос:https://stackoverflow.com/a/46676463/227578
альтернативой решениям mousedown является игнорирование событий размытия, вызванных щелчком определенных элементов (т. е. в вашем обработчике размытия пропустите выполнение, если это результат нажатия определенного элемента).
$("#myinput").live('blur',function(e){ if (!e.relatedTarget || !$(e.relatedTarget).is("#myresults ul li")) { $("#myresults").hide(); } });
я столкнулся с этой проблемой и с помощью
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'); });
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; */ });