remove - jquery unfocus input
jQuery: disparo de fuego() antes del evento blur() (5)
Tengo un campo de entrada, donde intento hacer una sugerencia de autocompletar. El código se ve como
<input type="text" id="myinput">
<div id="myresults"></div>
En el evento blur()
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 la pongo en mi div #myresults
.
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 para desactivar my li blur()
evento antes de que click()
y el valor de entrada no obtengo el html de li.
¿Cómo puedo configurar el evento click()
antes de blur()
?
Solución 1
Escucha el mousedown
lugar de click
.
Los eventos de mousedown
y blur
ocurren uno tras otro cuando presiona el botón del mouse, pero solo hace click
cuando lo suelta.
Solución 2
Puede mousedown
preventDefault()
en mousedown
para bloquear el menú desplegable de robar el foco. La pequeña 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. 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();
});
Acabo de responder una pregunta similar: https://.com/a/46676463/227578
Una alternativa a las soluciones 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).
$("#myinput").live(''blur'',function(e){
if (!e.relatedTarget || !$(e.relatedTarget).is("#myresults ul li")) {
$("#myresults").hide();
}
});
Las soluciones de Mousedown no funcionan para mí, cuando hago clic en elementos que no son de botón. Así que aquí está lo que he hecho con la función de desenfoque en mi código:
.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;
*/
});
Me enfrenté a este problema y usar mousedown
no es una opción para mí.
Lo resolví usando setTimeout
en la función de controlador
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'');
});
$(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();
}