En el siguiente ejemplo, cuando hace clic en la etiqueta, la entrada cambia de estado.
document.querySelector("label").addEventListener("click", function() {
console.log("clicked label");
});
label {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
<input type="checkbox" id="1">
<label for="1">Label</label>
En Chrome, cuando mueve el cursor entre los eventos mousedown
y mouseup
, la entrada aún se activa, mientras que en Firefox la casilla de verificación no cambia de estado.
¿Hay alguna manera de arreglar esto? (sin usar oyentes de eventos de JavaScript)
Versión de Firefox: 69.0.3 (64-bit)
Conjunto completo de acciones cuando se usa Chrome.
- Presione el botón sobre la etiqueta
- Mueva el cursor (incluso fuera de la etiqueta) mientras mantiene presionado el botón
- Regrese el cursor a la etiqueta
- Suelta el botón
javascript
html
css
label
Nick Zoum
fuente
fuente
1px
interrumpirá la interacción.Respuestas:
Introducción
Aunque expresé específicamente en la pregunta que la respuesta no debería involucrar JavaScript, todas las respuestas funcionaron con JavaScript.
Dado que esto parece ser un error de Firefox y la mayoría de las respuestas enviadas en este punto requerirían que yo también altere el resto de mi código, decidí crear un script que se pueda ejecutar una vez, se ocupará de todas las etiquetas independientemente de cuándo se agregan al dom y tendrán el menor impacto en mis otros scripts.
Solución - Ejemplo
Explicación
onLabelClick
La función
onLabelClick
debe llamarse cada vez que se hace clic en una etiqueta, verificará si la etiqueta tiene un elemento de entrada correspondiente. Si lo hace, dará lugar a que, quitar elfor
atributo de la etiqueta de modo que los navegadores no tienen el insecto no volver a activar el y después use unasetTimeout
de0ms
añadir lafor
vuelta atributo una vez que el evento ha burbujeaba. Esto significaevent.preventDefault
que no tiene que ser llamado y, por lo tanto, no se cancelarán otras acciones / eventos. Además, si necesito anular esta función, solo tengo que agregar un detector de eventos que llameEvent#preventDefault
o elimine elfor
atributo.manageLabel
La función
manageLabel
acepta una etiqueta comprueba si ya se ha agregado un detector de eventos para evitar volver a agregarlo, agrega el detector si aún no se ha agregado y lo agrega a la lista de etiquetas que se han administrado.onLoad
Es función para todas las etiquetas en el DOM en ese momento. La función también usa un MutationObserver para capturar cualquier etiqueta que se agregue, después de que se haya disparado la carga (y se haya ejecutado el script).
onLoad
necesita ser llamado cuando la página se carga para que la funciónmanageLabel
El código que se muestra arriba fue optimizado por Martin Barker .
fuente
HTMLLabelElement
cheque en lugar de un elemento HTMLE y un cheque de que tagName era una etiquetaSé que no querías oyentes de JS Event, pero estoy pensando que quieres identificar el movimiento que no es así, pero está usando mousedown en lugar de clic (mousedown seguido de mouseup).
Si bien este es un error conocido en Firefox, puede solucionarlo utilizando el evento mousedown
He tenido que cambiar su identificación para que sea válida. Una identificación debe comenzar con un personaje
fuente
querySelectorAll
) en la carga de la página y luego, cada vez que se agregue una etiqueta al dom. Esto también puede estropear cualquier oyente de eventos de mouse agregado a las etiquetas o al dom en general, ya que lo usaEvent#preventDefault
para evitar hacer doble clic en los navegadores que no tienen este error. Finalmente, usar elclick
evento sería mejor, ya que tendría la misma interacción que la acción prevista. Aparte de eso, esta es la mejor respuesta hasta ahora.preventDefault()
problema, por lo que funciona comprobando si el navegador lo ha cambiado si no lo cambia, después de 150 ms lo suficientemente rápido para que el usuario no lo note, y lo suficientemente lento como para que el navegador haya actuado intime si va a hacer lo que se supone que debe hacer. ¿eso está mejor?No. Esto parece un error de Firefox y no un problema con su código. No creo que haya una solución css para este comportamiento.
Es posible que pueda informarlo a Mozilla y solucionar el problema, pero no confiaría en eso. https://bugzilla.mozilla.org/home
Para una posible solución alternativa, sugeriría activar el evento en el mouseup.
fuente
Sin javascript, cuando hace clic en la etiqueta que tiene su valor "for" igual que el valor de "id" de las entradas, se hace clic en la entrada, pero esto no es coherente entre los navegadores.
Si un navegador sigue lo anterior, su evento de clic de JavaScript cancelará el efecto, lo que termina sin hacer nada.
Una solución
Para tener coherencia entre los navegadores, puede adoptar una estrategia diferente: Onload cambia dinámicamente todos los atributos 'para' para 'datos para', por lo que anula el efecto del navegador original. Luego puede aplicar su evento de clic a cada etiqueta.
fuente
document.attachEvent("onreadystatechange",
Solo estoy intrigado, ¿cómo es que fuiste con eso y nodocument.addEventListener("DOMContentLoaded",
?Adjuntar el evento al documento y apuntar al elemento que necesita allí debería resolver este problema.
$ (Document) .on ('click', '.item', function (event) {});
Sin embargo, al leer sobre este tema en el pasado, Firefox debe entender su acción como un intento de arrastrar el elemento, sin embargo, dado que la selección del usuario es ninguno, solo evita el comportamiento predeterminado.
Esto se basa en un conocimiento bastante limitado, pero parece ser un error / peculiaridad conocida y hay algunos artículos que lo respaldan.
fuente
without using JavaScript event listeners
.