Tengo un campo de entrada, donde trato de hacer una sugerencia de autocompletar. El código se parece a
<input type="text" id="myinput">
<div id="myresults"></div>
En el blur()
evento de entrada, quiero ocultar los resultados 'div:
$("#myinput").live('blur',function(){
$("#myresults").hide();
});
Cuando escribo algo en mi entrada, envío una solicitud al servidor y obtengo una respuesta json, la analizo en la estructura ul-> li y pongo esta ul en mi #myresults
div.
Cuando hago clic en este elemento li analizado, quiero establecer el valor de li para ingresar y ocultar #myresults
div
$("#myresults ul li").live('click',function(){
$("#myinput").val($(this).html());
$("#myresults").hide();
});
Todo va bien, pero cuando hago clic en mi blur()
evento li se activa antes click()
y el valor de entrada no obtiene el html de li.
¿Cómo puedo configurar un click()
evento antes blur()
?
blur
realmente se dispara después de hacer clic en unli
, entonces probablemente no necesite ejecutar$("#myresults").hide()
en el controlador de clics. Lo que parece que está sucediendo es que$(this).html()
está devolviendo una cadena vacía. ¿Podría ustedlog
oalert
$(this).html()
para asegurarse?blur()
yclick()
controladores, no hay acciones después de queblur()
finaliceRespuestas:
Solución 1
Escuche en
mousedown
lugar declick
.Los eventos
mousedown
yblur
se producen uno tras otro cuando presiona el botón del mouse, peroclick
solo ocurre cuando lo suelta.Solución 2
Puede
preventDefault()
enmousedown
bloquear el menú desplegable de robar el foco. La ligera ventaja es que el valor se seleccionará cuando se suelte el botón del mouse, que es cómo funcionan los componentes de selección nativos. JSFiddlefuente
VIOLÍN
fuente
Enfrenté este problema y usar
mousedown
no es una opción para mí.Resolví esto usando
setTimeout
la función de controladorfuente
Acabo de responder una pregunta similar: https://stackoverflow.com/a/46676463/227578
Una alternativa a las soluciones de mousedown es hacer que ignore los eventos de desenfoque causados al hacer clic en elementos específicos (es decir, en su controlador de desenfoque, omita la ejecución si es el resultado de hacer clic en un elemento específico).
fuente
Las soluciones de mousedown no me funcionan cuando hago clic en elementos que no son botones. Entonces, esto es lo que he hecho con la función de desenfoque en mi código:
fuente