Warum ist Onchange auf einem Kontrollkästchen nicht abgefeuert, wenn das Kontrollkästchen indirekt geändert wird?

StackOverflow https://stackoverflow.com/questions/2161213

Frage

Ich verwende Prototype, um Kontrollkästchen zu überwachen, damit ich ihnen JavaScript -Überprüfungen hinzufügen kann. Wenn das TR oder TD, in dem sich das Kontrollkästchen befindet, geklickt wird, sollte das Kontrollkästchen aktiviert werden.
Wenn Sie direkt auf ein Kontrollkästchen klicken, wird das OnChange -Ereignis abgefeuert, sodass Sie eine Warnung erhalten. Wenn der Wert des Kontrollkästchens durch JavaScript geändert wird (wenn Sie auf TR oder TD klicken), wird Onchange nicht abgefeuert. Warum wird Onchange nicht abgefeuert, wenn das Kontrollkästchen indirekt geändert wird?

Dies ist das JavaScript, das ich verwende.

Element.observe(window, 'load', function() {
        /* If a tr or td is clicked, change the value of the checkbox. */
        $$('#results tr').each(function(el) { 
            el.observe('click', function(e) {
                if(!e.target) { e.target = e.srcElement; }
                if(e.target.nodeName == 'TD' || e.target.nodeName == 'TR') {
                    $('compare-product'+this.id).checked = ($('compare-product'+this.id).checked === false) ? true : false;
                }
            });
        });
        /* Monitor if the status of a checkbox has changed. */
        $$('#results tr td input').each(function(el) {
                el.observe('change', function(e) {
                        alert('!');
                    }
                );
            }
        );
    }
);

Ich habe es in Firefox und IE7 getestet, beide funktionieren nicht. Ich suche keine Problemumgehung, ich bin nur gespannt, warum das nicht funktioniert.

War es hilfreich?

Lösung

Dies ist in UI -Frameworks im Allgemeinen nicht ungewöhnlich. Wenn Sie den Status eines Steuerelements programmgesteuert ändern, wird davon ausgegangen, dass Sie auch programmgesteuert sind, um alle Nebenwirkungen auszulösen, die es haben soll. Es gibt den Programmierern mehr Flexibilität und vermeidet Fehler, bei denen sich der Zustand während der Initialisierung oder dem Abbau im Fluss befindet. (Während der Initialisierung können Sie beispielsweise den Status eines Steuerelements festlegen, bevor Sie den Zustand mehrerer abhängiger festlegen. Wenn der Änderungshandler für die erste Steuerung sofort feuert, wird er ausgeführt, während die anderen Steuerelemente in einem inkonsistenten Zustand sind.)

Andere Tipps

Der wahre Grund, warum Sie dies nicht tun können, ist, dass es sich um Sicherheitsprobleme im Programmiermodell handelt. Ereignisse, die nicht initiiert wurden, sind normalerweise nicht gekettet. Obwohl das Einstellen eines Wertes in Ordnung ist, ist es nicht in Ordnung, Ereignisse zu entlassen, die auf diese Kontrolle eingestellt wurden.

Was Jamesdlin gesagt hat, macht keinen Sinn.

Jamesdlin:

"Während der Initialisierung können Sie beispielsweise den Status eines Steuerelements festlegen, bevor Sie den Zustand mehrerer abhängiger festlegen. Wenn der Änderungshandler für die erste Steuerung sofort feuert, wird er ausgeführt, während die anderen Steuerelemente in einem inkonsistenten Zustand sind."

Dies gilt unabhängig davon, ob Sie ihn programmgesteuert festlegen oder ob Sie auf die Steuerung klicken. In beiden Fällen können Sie andere Kontrollen abhängig machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top