Supongamos que adjunto un blur
función a un cuadro de entrada HTML como este:
<input id="myInput" onblur="function() { ... }"></input>
¿Hay alguna forma de obtener la ID del elemento que provocó el blur
evento (el elemento en el que se hizo clic) dentro de la función? ¿Cómo?
Por ejemplo, supongamos que tengo un lapso como este:
<span id="mySpan">Hello World</span>
Si hago clic en el intervalo justo después de que el elemento de entrada tenga el foco, el elemento de entrada perderá su foco. ¿Cómo sabe la función que se mySpan
hizo clic en ella?
PD: Si el evento onclick del intervalo se produjera antes del evento onblur del elemento de entrada, mi problema se resolvería, porque podría establecer algún valor de estado que indicara que se hizo clic en un elemento específico.
PPS: El fondo de este problema es que quiero activar un control de autocompletador AJAX externamente (desde un elemento en el que se puede hacer clic) para mostrar sus sugerencias, sin que las sugerencias desaparezcan inmediatamente debido al blur
evento en el elemento de entrada. Así que quiero revisar elblur
función si se ha hecho clic en un elemento específico y, de ser así, ignorar el evento de desenfoque.
fuente
Respuestas:
Hmm ... En Firefox, puede usar
explicitOriginalTarget
para extraer el elemento en el que se hizo clic. EsperabatoElement
hacer lo mismo para IE, pero no parece funcionar ... Sin embargo, puede extraer el elemento recién enfocado del documento:Advertencia: esta técnica no funciona para los cambios de enfoque causados por la tabulación de los campos con el teclado, y no funciona en absoluto en Chrome o Safari. ¡El gran problema con el uso
activeElement
(excepto en IE) es que no se actualiza constantemente hasta después deblur
que se haya procesado el evento, y puede que no tenga ningún valor válido durante el procesamiento! Esto se puede mitigar con una variación en la técnica que Michiel terminó usando :Esto debería funcionar en la mayoría de los navegadores modernos (probados en Chrome, IE y Firefox), con la advertencia de que Chrome no establece el foco en los botones en los que se hace clic (en comparación con pestañas).
fuente
blur
evento. He actualizado la respuesta con detalles. ¿Has intentado usar activeElement para esto en Chrome o Firefox? Te da el elemento que está siendo borroso ...Respuesta de 2015 : según UI Events , puede usar la
relatedTarget
propiedad del evento:Para
blur
eventos,Ejemplo:
Nota: Firefox no será compatible
relatedTarget
hasta la versión 48 ( error 962251 , MDN ).fuente
relatedTarget
regresaránull
si el objetivo que recibe el foco no es un elemento de entrada.tabIndex="0"
atributo y funcionaráFinalmente lo resolví con un tiempo de espera en el evento onblur (gracias al consejo de un amigo que no es StackOverflow):
Funciona tanto en FF como en IE.
fuente
Es posible usar el evento mousedown del documento en lugar del desenfoque:
fuente
Las
FocusEvent
instancias de tipo tienenrelatedTarget
atributo, sin embargo, hasta la versión 47 del FF, específicamente, este atributo devuelve nulo, de 48 ya funciona.Puedes ver más aquí .
fuente
También estoy tratando de hacer que Autocompleter ignore el desenfoque si un elemento específico hizo clic y tiene una solución de trabajo, pero solo para Firefox debido al explícitoOriginalTarget
Este código envuelve el método onBlur predeterminado del Autocompletador y comprueba si se configuran los parámetros ignoreBlurEventElement. si está configurado, verifica cada vez para ver si el elemento en el que se hizo clic es ignoreBlurEventElement o no. Si es así, el Autocompletador no llama onBlur, sino que llama a onBlur. El único problema con esto es que solo funciona en Firefox porque la propiedad explícitaOriginalTarget es específica de Mozilla. Ahora estoy tratando de encontrar una forma diferente a usar explícitaOriginalTarget. La solución que ha mencionado requiere que agregue el comportamiento onclick manualmente al elemento. Si no puedo resolver el problema explícito de OriginalOriginalTarget, creo que seguiré tu solución.
fuente
¿Puedes revertir lo que estás comprobando y cuándo? Eso es si recuerdas lo que fue borroso por última vez:
y luego en onClick para su lapso, llame a function () con ambos objetos:
Su función podría decidir si activar o no el control Ajax.AutoCompleter. La función tiene el objeto cliqueado y el objeto borroso. El onBlur ya ha sucedido, por lo que no hará desaparecer las sugerencias.
fuente
Usa algo como esto:
Y luego dentro de su función:
Y entonces:
Y entonces:
Código final:
fuente
Creo que no es posible, con IE puedes intentar usarlo
window.event.toElement
, ¡pero no funciona con Firefox!fuente
Como se señaló en esta respuesta , puede verificar el valor de
document.activeElement
.document
es una variable global, por lo que no tiene que hacer ninguna magia para usarla en su controlador onBlur:fuente
Entonces, la mejor manera es usar el evento onclick on body para comprender indirectamente que su nodo (event.target) está borroso
fuente
Funciona en Google Chrome v66.x, Mozilla v59.xy Microsoft Edge ... Solución con jQuery.
Comente su prueba en otras versiones de Internet Explorer.
fuente
Editar: Una forma hacky de hacerlo sería crear una variable que mantenga un seguimiento del enfoque para cada elemento que le interese. Entonces, si le importa que 'myInput' haya perdido el foco, establezca una variable en foco.
Respuesta original: puede pasar 'esto' a la función.
fuente
Sugiero usar variables globales blurfrom y blurto. Luego, configure todos los elementos que le interesan para asignar su posición en el DOM a la variable desenfoque de cuando pierden el foco. Además, configúrelos de modo que ganar foco establezca la variable en su posición en el DOM. Luego, podría usar otra función por completo para analizar el desenfoque y los datos blurto.
fuente
tenga en cuenta que la solución con explicitOriginalTarget no funciona para saltos de entrada de texto a entrada de texto.
intente reemplazar los botones con las siguientes entradas de texto y verá la diferencia:
fuente
He estado jugando con esta misma función y descubrí que FF, IE, Chrome y Opera tienen la capacidad de proporcionar el elemento fuente de un evento. No he probado Safari, pero supongo que podría tener algo similar.
fuente
No me gusta usar el tiempo de espera al codificar JavaScript, por lo que lo haría de la manera opuesta a Michiel Borkent. (No probé el código, pero deberías tener la idea).
En la cabeza algo así
fuente
Puedes arreglar IE con:
Parece "explícitoOriginalTarget" para FF.
Antoine y J
fuente
Escribí una solución alternativa cómo hacer que cualquier elemento sea enfocable y "borrable".
Se basa en hacer un elemento como
contentEditable
y ocultarlo visualmente y deshabilitar el modo de edición en sí:MANIFESTACIÓN
Nota: Probado en Chrome, Firefox y Safari (OS X). No estoy seguro acerca de IE.
Relacionado: Estaba buscando una solución para VueJs, así que para aquellos interesados / curiosos en cómo implementar dicha funcionalidad utilizando la directiva Vue Focusable, echen un vistazo .
fuente
De esta manera:
O si adjunta el oyente a través de JavaScript (jQuery en este ejemplo):
Editar : lo siento. Leí mal la pregunta.
fuente
Creo que es fácilmente posible a través de jquery pasando la referencia del campo que causa el evento onblur en "this".
Por ej.
Gracias
monika
fuente
Podrías hacerlo así:
fuente
Solo veo hacks en las respuestas, pero en realidad hay una solución integrada muy fácil de usar: Básicamente, puede capturar el elemento de enfoque de esta manera:
https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement
fuente