Deaktivieren einer Schaltfläche in vanilla JavaScript und jQuery
Vanille JavaScript
In vanilla JavaScript, kann man einfach aktivieren und deaktivieren Sie eine Schaltfläche mit der folgenden Anweisung:
button.disabled = state;
Dies funktioniert sowohl, wenn Menschen versuchen, auf eine Schaltfläche klicken, und wenn Schaltflächen angeklickt werden programmatisch:
JS:
var button = document.getElementById('myButton');
button.addEventListener('click', function() {
alert('world');
});
button.disabled = true;
button.click(); //No output
button.disabled = false;
button.click(); //Output : "Hello" and "world
button.disabled = true;
button.click(); //No output
HTML:
<input type="button" id="myButton" value="button" onClick="alert('Hello')"/>
Dies funktioniert auch bei Verwendung der MouseEvent
Schnittstelle:
JS:
var button = document.getElementById('myButton');
var click = new MouseEvent("click", {
"view": window
});
button.addEventListener('click', function() {
alert('world');
});
button.disabled = true;
button.dispatchEvent(click); //No output
button.disabled = false;
button.dispatchEvent(click); //Output : "Hello" and "world
button.disabled = true;
button.dispatchEvent(click); //No output
HTML:
<input type="button" id="myButton" value="button" onClick="alert('Hello')"/>
jQuery
Ich kann nicht scheinen, um in der Lage sein, das gleiche zu tun mit jQuery, aber :
JS:
var button = $("#myButton");
button.on("click", function() {
alert("world");
});
button.prop("disabled", true);
button.click(); //Output : "world" and "Hello"
button.prop("disabled", false);
button.click(); //Output : "world" and "Hello"
button.prop("disabled", true);
button.click(); //Output : "world" and "Hello"
HTML:
<script src="https://code.jquery.com/jquery-1.12.2.min.js"></script>
<input type="button" id="myButton" value="button" onClick="alert('Hello')"/>
Beide button.prop("disabled", true);
und button.attr("disabled", true);
ändern Sie einfach die disabled
- Eigenschaft des button-element, aber weder deaktiviert die tatsächliche click-Ereignis. Dies bedeutet, dass Ereignisse ausgelöst werden, wenn button.click();
heißt, selbst wenn der button deaktiviert ist!
Zusätzlich, die "Welt" und "Hallo" - Ausgabe in der falschen Reihenfolge.
Die einfachste code, den ich kommen könnte, um zu emulieren das Verhalten der vanilla-JavaScript-Versionen, ist dieses :
JS:
var button = $("#myButton");
button.on("click", function() {
alert("world");
});
button.disable = (function() {
var onclick = null;
var click = [];
return function(state) {
if(state) {
this.prop('disabled', true);
if(this.prop('onclick') !== null) {
onclick = this.prop('onclick');
this.prop('onclick', null);
}
var listeners = $._data(this.get()[0], "events");
listeners = typeof listeners === 'undefined' ? [] : listeners['click'];
if(listeners && listeners.length > 0) {
for(var i = 0; i < listeners.length; i++) {
click.push(listeners[i].handler);
}
this.off('click');
}
} else {
this.removeProp('disabled');
if(onclick !== null) {
this.prop('onclick', onclick);
onclick = null;
}
if(click.length > 0) {
this.off('click');
for(var i = 0; i < click.length; i++) {
this.on("click", click[i]);
}
click = [];
}
}
}
})();
button.disable(true);
button.click(); //No output
button.disable(false);
button.click(); //Output : "Hello" and "world
button.disable(true);
button.click(); //No output
HTML:
<script src="https://code.jquery.com/jquery-1.12.2.min.js"></script>
<input type="button" id="myButton" value="button" onClick="alert('Hello')"/>
Ist natürlich lächerlich verworren und "hacky" code, etwas zu erreichen, so einfach wie das deaktivieren einer Taste.
Meine Fragen
- Warum ist es, dass jQuery - anders als vanilla-JS - nicht deaktivieren Sie die Ereignisse beim deaktivieren einer Schaltfläche?
- Ist dies als ein Fehler oder ein feature in jQuery?
- Gibt es etwas, was ich im Blick?
- Ist es ein einfacher Weg, um das erwartete Verhalten in jQuery?
- Interessante Frage. Meine erste Vermutung wäre, dass jQuery macht genau das, was Sie erzählt - Sie anbei einen click-handler an das element, und es brav ausgelöst, wenn geklickt wird. Ist es nicht eigentlich egal, ob es aktiviert ist oder nicht, da es nur behandelt wie ein DOM-element. Es scheint jedoch, dass die gleiche gilt nicht für eine nur JS.
- api.jquery.com/off
- Die
.off()
Methode entfernt nur event-Handler, die befestigt waren mit.on()
- Mein Vorschlag war, entfernen Sie die Bindung beim deaktivieren und erneut zu binden. Nicht sicher, über seine Effizienz, obwohl
- Was passiert, wenn Sie entfernen Sie den inline -
onClick
Funktionen Ihrer Elemente ? - Siehst du das hässliche workaround unten auf meine Frage? Was ich hier mache, ist ziemlich viel, was man vorschlagen: Entferne ich alle click-Handler und speichern Sie Sie irgendwo, wenn ich "deaktivieren" die Taste. Beim re-aktivieren Sie die Taste, füge ich Sie wieder.
- Dies geschieht,, wenn ich entfernen Sie die inline -
onClick
Funktionen aus meiner Elemente - Was ich tun würde in so einer situation ist, überprüfen Sie den Status der Schaltfläche (aktiviert oder deaktiviert) nach meinem click-handler und Sachen tun, entsprechend. Ich bin damit einverstanden, dass dies eine Abweichung vom erwarteten Verhalten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zu erreichen, erwartetes Ergebnis, Sie nutzen kann
.isTrigger
innerhalb von jQuery ausgelöstclick
- handler, um zu bestimmen, wenn ein Ereignis ausgelöst wird, durchjavascript
, und nicht die Aktion des Benutzers.Attribut definieren Ereignis-listener als eine benannte Funktion, wo
this
übergeben werden können, um zu überprüfendisabled
Eigentum anif
Zustand, wennalert()
aufgerufen oder nicht aufgerufen wird.Verwenden
.attr("disabled", "disabled")
zu setzendisabled
im element,.removeAttr("disabled")
auf Attribut entfernen;.attr("onclick", null)
zum entfernen von Ereignis-Attributonclick
handler;.attr("onclick", "handleClick(true)")
zurücksetzen event-Attribut.HTML:
Wenn Sie schauen, um jquery-1.12.4.js bei diesen Zeilen:
Werden Sie Sie finden einen anderen Umgang mit der Veranstaltungen nach delegation-Typ:
JS:
HTML:
Natürlich, wenn Sie legen Sie die Veranstaltung wie in:
Das Verhalten ist anders und seltsam.
Verwenden .prop() ist der richtige Weg, es zu tun. Ich denke das Thema ist in der Weise, dass Sie "testen" können. Siehe das Beispiel, wo die Tasten sind deaktiviert/aktiviert richtig mit der toggle-Taste, unabhängig davon, ob der handler angefügt ist per onclick oder mit jquery.
JS:
HTML:
Die offensichtliche Lösung ist, um Sie nur vanilla javascript. Nur weil du mit jQuery, bedeutet nicht, dass alles "muss" getan werden, es zu benutzen. Es gibt einige Dinge, die sind in Ordnung zu tun, ohne jQuery.
EDIT: ich bearbeitet die snippet zeigt, wie Sie verhindern könnten, dass die jquery .klicken Sie auf() tatsächlich auf die Auslösung der Warnungen.
click
Schaltfläche programmatisch ignoriert, ob oder nicht die Schaltfläche istdisabled
(siehe diese Geige). Sollte dies nicht der Fall sein und ist so ziemlich das Problem, das ich offenbar nicht lösen können ohne ein dirty workaround!Du bist ruft die Klick-Funktion direkt 3 mal (- Taste.klicken Sie auf () ), die unabhängig davon ausgelöst, disabled-Attribut.
Behinderte Eigenschaft nur auf click-Ereignisse reagiert.
Siehe Aktuelles Beispiel:
JS:
HTML: