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.

InformationsquelleAutor John Slegers | 2016-08-06
Schreibe einen Kommentar