javascript - trigger - onfocus blur jquery
jQuery.focusout/.click conflict (3)
¿Qué hay de usar
:flotar
Resolví el mismo problema usándolo.
$(''className'').on(''focusout'', function(e) {
if($(''.suggestLi'' + '':hover'').length) {
return;
}
$(''.suggestList'').empty();
});
Estoy trabajando en un proyecto con un cuadro de búsqueda autocompletado. Ahora tengo el problema de que deseo pasar el valor del autocompletador que se encuentra al cuadro de entrada, pero al mismo tiempo, quiero que la caja de autocompletado se oculte cuando el campo de entrada no esté más enfocado.
Ahora tengo un conflicto con ambos ya que el clic en el autocompletebox se ve como enfoque y oculta el cuadro incluso antes de que pueda pasar el valor. ¿Algún indicador o soluciones para este tipo de problema? Aquí un jsfiddle para que sea más claro para usted.
O aquí
CSS :
#a_c {display:none;}
JS :
$(''#search_field'').focusout(function() {
$(''#a_c'').hide(); // IF I DELETE THIS IT WORKS
});
$(''#search_field'').focusin(function() {
$(''#a_c'').show();
});
$(''#a_c a'').click(function() {
$(''#search_field'').val('''');
var value = $(this).text();
var input = $(''#search_field'');
input.val(input.val() + value);
$(''#a_c'').hide();
return false;
});
HTML :
<input autocomplete="off" onkeyup="searchFor(this.value);" name="search" id="search_field" class="bold" type="text" placeholder="Search...">
<div id="a_c"><a href="">hello world</a></div>
La forma en que resolví esto fue usando el evento mousedown
lugar de click
. El evento mousedown
siempre se activa antes que el evento focusout
mientras que el click
no lo es.
Puedes probarlo en la pequeña demo a continuación. Enfócate en el campo y luego haz clic en el botón.
const field = document.getElementById(''field'');
const btn = document.getElementById(''btn'');
btn.addEventListener(''click'', () => console.log(''Click''));
btn.addEventListener(''mousedown'', () => console.log(''Mouse down''));
field.addEventListener(''focusout'', () => console.log(''Focus out''));
<input id="field">
<button id="btn">Try it</button>
Como puede ver, la salida está en el siguiente orden:
- Ratón hacia abajo
- Enfocar hacia fuera
- Hacer clic
Esta es la solución más estable sin utilizar hacks de solución temporal como los tiempos de espera. Tampoco depende de jQuery. Lo único que vale la pena tener en cuenta es que la mousedown
no espera a que el usuario suelte el botón del mouse, sino que, en términos de experiencia de usuario, no es realmente una preocupación aquí.
Mi solución en una situación similar fue usar el tiempo de espera para suspender temporalmente la acción realizada en el controlador de eventos de blur
. Me gusta esto:
$(''#search_field'').focusout(function() {
window.setTimeout(function() { $(''#a_c'').hide() }, 100);
});