5


0

チェックボックスが間接的に変更されたときに、チェックボックスのonchangeが起動しないのはなぜですか

Prototypeを使用してチェックボックスを監視しているため、JavaScriptチェックを追加できます。 チェックボックスが配置されているtrまたはtdをクリックすると、チェックボックスがオンになります。 +チェックボックスを直接クリックすると、onchangeイベントが発生するため、アラートが表示されます。 チェックボックスの値がjavascriptによって変更されたとき(trまたはtdをクリックしたとき)、onchangeは発生しません。 チェックボックスが間接的に変更されたときにonchangeが起動しないのはなぜですか?

これは私が使用しているjavascriptです。

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('!');
                    }
                );
            }
        );
    }
);

FirefoxとIE7でテストしましたが、どちらも機能していません。 私は回避策を探していません。なぜこれが機能しないのか知りたいだけです。

2 Answer


5


これは、一般的なUIフレームワークでは珍しいことではありません。 コントロールの状態をプログラムで変更する場合、想定されるあらゆる副作用をプログラムでトリガーすることもできると想定されています。 プログラマーに柔軟性を与え、初期化または分解中に状態が変化するバグを回避します。 (たとえば、初期化中に、いくつかの従属コントロールの状態を設定する前に、1つのコントロールの状態を設定できます。 最初のコントロールの変更ハンドラーがすぐに起動すると、他のコントロールが一貫性のない状態にある間に実行されます。


0


これができない本当の理由は、それがプログラミングモデルのセキュリティの問題だからです。 ユーザーが開始したものではないイベントは、通常チェーンされません。 そのため、値を設定することは問題ありませんが、先に進み、そのコントロールに設定されたイベントを発生させることは問題ありません。

jamesdlinが言ったことは意味がありません。

_ _ ジェームズドリン:

「たとえば、初期化中に、いくつかの従属コントロールの状態を設定する前に、1つのコントロールの状態を設定できます。 最初のコントロールの変更ハンドラーがすぐに起動すると、他のコントロールが一貫性のない状態にある間に実行されます。」 _ _

プログラムで値を変更するように設定した場合でも、コントロールをクリックした場合でも、これは当てはまります。 どちらの場合でも、他のコントロールに依存している場合があります。