Dans l'exemple suivant, lorsque vous cliquez sur l'étiquette, l'entrée change d'état.
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>
Dans Chrome, lorsque vous déplacez le curseur entre les événements mousedown
et mouseup
, l'entrée est toujours déclenchée, tandis que dans Firefox, la case à cocher ne change pas d'état.
Y'a t'il un moyen d'arranger cela? (sans utiliser les écouteurs d'événement JavaScript)
Version de Firefox: 69.0.3 (64-bit)
Ensemble complet d'actions lors de l'utilisation de Chrome.
- Appuyez sur le bouton sur l'étiquette
- Déplacez le curseur (même en dehors de l'étiquette) tout en maintenant le bouton enfoncé
- Remettez le curseur sur l'étiquette
- Relâchez le bouton
javascript
html
css
label
nick zoum
la source
la source
1px
interrompra même l'interaction.Réponses:
introduction
Bien que j'aie spécifiquement indiqué dans la question que la réponse ne devrait pas impliquer JavaScript, toutes les réponses fonctionnaient avec JavaScript.
Étant donné que cela semble être un bogue de Firefox et que la plupart des réponses soumises à ce stade nécessiteraient que je modifie également le reste de mon code, j'ai décidé de créer un script qui peut être exécuté une fois, traitera toutes les étiquettes indépendamment du moment ils sont ajoutés au dom et auront le moins d'impact sur mes autres scripts.
Solution - Exemple
Explication
onLabelClick
La fonction
onLabelClick
doit être appelée chaque fois qu'une étiquette est cliquée, elle vérifiera si l'étiquette a un élément d'entrée correspondant. Si c'est le cas, il le déclenchera, supprimera l'for
attribut de l'étiquette afin que les navigateurs n'aient pas le bogue ne le déclenchera pas à nouveau, puis utilisez unsetTimeout
de0ms
pour rajouter l'for
attribut une fois que l'événement s'est propagé. Cela signifie qu'ilevent.preventDefault
n'est pas nécessaire d'être appelé et donc aucune autre action / événement ne sera annulée. De plus, si j'ai besoin de remplacer cette fonction, je dois simplement ajouter un écouteur d'événements qui appelleEvent#preventDefault
ou supprime l'for
attribut.manageLabel
La fonction
manageLabel
accepte une étiquette vérifie s'il a déjà été ajouté un écouteur d'événements pour éviter de l'ajouter à nouveau, ajoute l'écouteur s'il n'a pas déjà été ajouté et l'ajoute à la liste des étiquettes gérées.onLoad
La fonction
onLoad
doit être appelée lorsque la page est chargée afin qu'ellemanageLabel
puisse être appelée pour toutes les étiquettes du DOM à ce moment. La fonction utilise également un MutationObserver pour intercepter toutes les étiquettes ajoutées après le lancement de la charge (et l'exécution du script).Le code affiché ci-dessus a été optimisé par Martin Barker .
la source
HTMLLabelElement
chèque au lieu d'un HTMLElement et d'un chèque que le tagName était une étiquetteJe sais que vous ne vouliez pas d'écouteurs JS Event, mais je pense que vous voulez identifier le mouvement, ce n'est pas le cas, mais utilisez mousedown au lieu de cliquer (mousedown suivi de mouseup).
Bien qu'il s'agisse d'un bug connu dans Firefox, vous pouvez le contourner en utilisant l' événement mousedown
J'ai dû changer votre identifiant pour être un identifiant valide doit commencer par un caractère
la source
querySelectorAll
) au chargement de la page et ensuite, chaque fois qu'une étiquette est ajoutée au dom. Cela peut également gâcher les écouteurs d'événements de souris ajoutés aux étiquettes ou au dom en général lorsque vous utilisezEvent#preventDefault
pour éviter de double-cliquer sur les navigateurs qui n'ont pas ce bogue. Enfin, ilclick
serait préférable d' utiliser l' événement, car il aurait la même interaction que l'action envisagée. À part cela, c'est la meilleure réponse jusqu'à présent.preventDefault()
problème, donc cela fonctionne en vérifiant si le navigateur l'a changé sinon le change, après 150 ms assez vite pour que l'utilisateur ne le remarque pas, et assez lentement pour que le navigateur ait agi intime si ça va faire ce qu'il est censé faire. Est-ce mieux?Non. Cela ressemble à un bogue firefox et non à un problème avec votre code. Je ne crois pas qu'il existe une solution de contournement CSS pour ce comportement.
Vous pourrez peut-être le signaler à Mozilla et résoudre le problème, mais je ne m'y fierais pas. https://bugzilla.mozilla.org/home
Pour une solution de contournement potentielle, je suggérerais plutôt de déclencher l'événement sur mouseup.
la source
Sans javascript, lorsque vous cliquez sur l'étiquette dont la valeur "pour" est identique à la valeur "id" des entrées, l'entrée est cliquée, mais cela n'est pas cohérent entre les navigateurs.
Si un navigateur suit ce qui précède, votre événement de clic javascript annulera l'effet, ce qui finira par ne rien faire.
Une solution
Pour avoir une cohérence entre les navigateurs, vous pouvez adopter une stratégie différente: Onload change dynamiquement tous les attributs "for" pour "data-for", de sorte qu'il annule l'effet du navigateur d'origine. Ensuite, vous pouvez appliquer votre événement de clic à chaque étiquette.
la source
document.attachEvent("onreadystatechange",
Je suis juste perplexedocument.addEventListener("DOMContentLoaded",
.Attacher l'événement au document et cibler l'élément dont vous avez besoin devrait trier ce problème.
$ (Document) .on ('click', '.item', function (event) {});
De la lecture de ce sujet dans le passé, il revient à Firefox de comprendre votre action comme une tentative de faire glisser l'élément, cependant, puisque la sélection de l'utilisateur est nulle, cela empêche simplement le comportement par défaut.
Ceci est basé sur des connaissances assez limitées mais il semble que ce soit un bug / bizarrerie connu et il y a quelques articles qui flottent autour de cela.
la source
without using JavaScript event listeners
.