Wenn Sie im folgenden Beispiel auf die Beschriftung klicken, ändert sich der Status der Eingabe.
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>
Wenn Sie in Chrome den Cursor zwischen den Ereignissen mousedown
und bewegen, wird die mouseup
Eingabe weiterhin ausgelöst, während in Firefox das Kontrollkästchen den Status nicht ändert.
Gibt es eine Möglichkeit, dies zu beheben? (ohne Verwendung von JavaScript-Ereignis-Listenern)
Firefox-Version: 69.0.3 (64-bit)
Vollständiger Aktionssatz bei Verwendung von Chrom.
- Drücken Sie die Taste über dem Etikett
- Bewegen Sie den Cursor (auch außerhalb des Etiketts), während Sie die Taste gedrückt halten
- Setzen Sie den Cursor wieder auf die Beschriftung
- Lass den Knopf los
javascript
html
css
label
Nick Zoum
quelle
quelle
1px
wird die Interaktion unterbrochen .Antworten:
Einführung
Obwohl ich in der Frage ausdrücklich angegeben habe, dass die Antwort kein JavaScript beinhalten sollte, funktionierten alle Antworten mit JavaScript.
Da dies ein Firefox-Fehler zu sein scheint und die meisten an dieser Stelle eingereichten Antworten erfordern würden, dass ich auch den Rest meines Codes ändere, habe ich beschlossen, ein Skript zu erstellen, das einmal ausgeführt werden kann und alle Labels unabhängig vom Zeitpunkt behandelt Sie werden dem Dom hinzugefügt und haben den geringsten Einfluss auf meine anderen Skripte.
Lösung - Beispiel
Erläuterung
onLabelClick
Die Funktion
onLabelClick
muss aufgerufen werden, wenn auf eine Beschriftung geklickt wird. Sie prüft, ob die Beschriftung ein entsprechendes Eingabeelement enthält. Ist dies der Fall, wird es auslösen, das entfernenfor
Attribut des Etiketts , so dass der Browser nicht nicht den Fehler hat , erneut ausgelöst es und dann eine VerwendungsetTimeout
von0ms
dem hinzufügenfor
Attribute zurück , sobald das Ereignis bis gesprudelt hat. Dies bedeutet,event.preventDefault
dass Sie nicht aufgerufen werden müssen und somit keine anderen Aktionen / Ereignisse abgebrochen werden. Auch wenn ich diese Funktion überschreiben muss, muss ich nur einen Ereignis-Listener hinzufügen,Event#preventDefault
der dasfor
Attribut aufruft oder entfernt .manageLabel
Die Funktion
manageLabel
Akzeptiert eine Beschriftung, prüft, ob bereits ein Ereignis-Listener hinzugefügt wurde, um ein erneutes Hinzufügen zu vermeiden, fügt den Listener hinzu, falls er noch nicht hinzugefügt wurde, und fügt ihn der Liste der verwalteten Beschriftungen hinzu.onLoad
Die Funktion
onLoad
muss beim Laden der Seite aufgerufen werden, damit die FunktionmanageLabel
zu diesem Zeitpunkt für alle Beschriftungen im DOM aufgerufen werden kann. Die Funktion verwendet auch einen MutationObserver , um alle Labels abzufangen, die hinzugefügt werden, nachdem das Laden ausgelöst wurde (und das Skript ausgeführt wurde).Der oben angezeigte Code wurde von Martin Barker optimiert .
quelle
HTMLLabelElement
Prüfung ersetzt , anstatt sowohl ein HTMLElement als auch eine Prüfung, dass der tagName ein Label warIch weiß, dass Sie keine JS-Ereignis-Listener wollten, aber ich denke, Sie möchten die Bewegung identifizieren, die dies nicht tut, sondern Mousedown anstelle von Klick verwendet (Mousedown gefolgt von Mouseup).
Obwohl dies ein bekannter Fehler in Firefox ist, können Sie ihn mithilfe des Mousedown-Ereignisses umgehen
Ich musste Ihre ID ändern, um eine gültige ID zu haben. Die ID muss mit einem Zeichen beginnen
quelle
querySelectorAll
) beim Laden der Seite ausführen muss und dann jedes Mal, wenn dem Dom ein Label hinzugefügt wird. Dies kann auch alle Listener von Mausereignissen durcheinander bringen, die Labels oder dem Dom im Allgemeinen hinzugefügt wurden,Event#preventDefault
um ein Doppelklicken auf Browser zu vermeiden, die diesen Fehler nicht aufweisen. Schließlichclick
wäre die Verwendung des Ereignisses besser, da es dieselbe Interaktion wie die beabsichtigte Aktion hätte. Davon abgesehen ist dies die bisher beste Antwort.preventDefault()
Problem zu beheben. Daher wird überprüft, ob der Browser ihn geändert hat, wenn er nicht geändert wurde. Nach 150 ms ist er schnell genug, damit der Benutzer ihn nicht bemerkt, und langsam genug, dass der Browser reagiert hat Intime, wenn es tun wird, was es soll. ist das besser?Nein. Dies sieht aus wie ein Firefox-Fehler und kein Problem mit Ihrem Code. Ich glaube nicht, dass es eine CSS-Problemumgehung für dieses Verhalten gibt.
Möglicherweise können Sie es Mozilla melden und das Problem beheben, aber darauf würde ich mich nicht verlassen. https://bugzilla.mozilla.org/home
Für eine mögliche Problemumgehung würde ich vorschlagen, das Ereignis stattdessen beim Mouseup auszulösen.
quelle
Wenn Sie ohne Javascript auf die Beschriftung klicken, deren "for" -Wert mit dem "id" -Wert der Eingabe identisch ist, wird auf die Eingabe geklickt, dies ist jedoch unter Browsern nicht konsistent.
Wenn ein Browser den obigen Anweisungen folgt, hebt Ihr Javascript-Klickereignis den Effekt auf, was dazu führt, dass nichts unternommen wird.
Eine Lösung
Um die Konsistenz zwischen den Browsern zu gewährleisten, können Sie eine andere Strategie anwenden: Beim Laden werden alle Attribute 'für' für 'Daten für' dynamisch geändert, sodass der ursprüngliche Browsereffekt auf Null gesetzt wird. Anschließend können Sie Ihr Klickereignis auf jedes Label anwenden.
quelle
document.attachEvent("onreadystatechange",
Ich bin nur gespannt, wie kommt es, dass du damit umgegangen bist und nichtdocument.addEventListener("DOMContentLoaded",
?Wenn Sie das Ereignis an das Dokument anhängen und auf das Element abzielen, das Sie dort benötigen, sollte dieses Problem behoben werden.
$ (Document) .on ('click', '.item', function (event) {});
Nach dem Lesen dieses Themas in der Vergangenheit liegt es an Firefox, Ihre Aktion als Versuch zu verstehen, das Element zu ziehen. Da die Benutzerauswahl jedoch keine ist, wird lediglich das Standardverhalten verhindert.
Dies basiert auf ziemlich begrenztem Wissen, aber es scheint ein bekannter Fehler zu sein, und es gibt einige Artikel, die dies unterstützen.
quelle
without using JavaScript event listeners
.