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 #myresultsdiv.
Cuando hago clic en este elemento li analizado, quiero establecer el valor de li para ingresar y ocultar #myresultsdiv
$("#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()?

blurrealmente 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 ustedlogoalert$(this).html()para asegurarse?blur()yclick()controladores, no hay acciones después de queblur()finaliceRespuestas:
Solución 1
Escuche en
mousedownlugar declick.Los eventos
mousedownyblurse producen uno tras otro cuando presiona el botón del mouse, peroclicksolo ocurre cuando lo suelta.Solución 2
Puede
preventDefault()enmousedownbloquear 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
mousedownno es una opción para mí.Resolví esto usando
setTimeoutla 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