5

チェックボックスを監視するためにプロトタイプを使用しているので、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でテストしましたが、どちらも機能していません。私は回避策を探していません。なぜこれが機能しないのか知りたいだけです。

4

2 に答える 2

5

これは、一般的なUIフレームワークでは珍しいことではありません。コントロールの状態をプログラムで変更する場合は、想定される副作用をプログラムでトリガーすることもできると想定されます。これにより、プログラマーはより柔軟になり、初期化またはティアダウン中に状態が流動的になるバグを回避できます。(たとえば、初期化中に、複数の依存コントロールの状態を設定する前に、1つのコントロールの状態を設定できます。最初のコントロールの変更ハンドラーがすぐに起動すると、他のコントロールが不整合な状態のときに実行されます。)

于 2010-01-29T10:37:59.747 に答える
0

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

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

ジェームズドリン:

「たとえば、初期化中に、複数の依存コントロールの状態を設定する前に、1つのコントロールの状態を設定できます。最初のコントロールの変更ハンドラーがすぐに起動すると、他のコントロールが不整合な状態のときに実行されます。」

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

于 2010-12-03T18:07:27.727 に答える