Javascript 当复选框被间接更改时,为什么复选框上的onchange没有被激发

Javascript 当复选框被间接更改时,为什么复选框上的onchange没有被激发,javascript,prototype,checkbox,onchange,Javascript,Prototype,Checkbox,Onchange,我使用Prototype来监视复选框,这样我就可以向它们添加javascript检查。单击复选框所在的tr或td时,应选中该复选框。 当您直接单击复选框时,将触发onchange事件,因此您将收到警报。当复选框的值被javascript更改时(当您单击tr或td时),onchange不会被触发。当复选框被间接更改时,为什么onchange没有被激发 这就是我正在使用的javascript Element.observe(window, 'load', function() { /

我使用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中测试过了,但都不起作用。我不是在寻找解决方法,我只是想知道为什么这不起作用。

这在UI框架中通常并不少见。如果以编程方式更改控件的状态,则假定您也能够以编程方式触发它应有的任何副作用。它为程序员提供了更大的灵活性,并且避免了在初始化或拆卸过程中状态不断变化的错误。(例如,在初始化过程中,您可以先设置一个控件的状态,然后再设置几个相关控件的状态。如果第一个控件的更改处理程序立即启动,它将在其他控件处于不一致状态时执行。)您不能这样做的真正原因是编程模型中存在安全问题。非用户发起的事件通常不会链接。因此,尽管设置一个值是可以的,但是继续并触发在该控件上设置的任何事件是不可以的

詹姆斯德林所说的毫无意义

詹姆斯德林:

“例如,在初始化期间, 您可以设置一个控件的状态 在设置多个参数的状态之前 依赖的。如果更改处理程序 第一次控制火灾 它将立即执行,而 其他控件处于不一致的状态 国家。”


无论是以编程方式设置它还是更改值,或者是单击控件,这都是正确的。在任何一种情况下,您都可能有依赖的其他控件。

如果是,如果在事件处理代码中更改复选框的状态,会发生什么情况?我不明白您的意思。如果更改偶数处理程序中的状态,则会再次调用相同的事件处理程序。如果是这样的话,您可能会有一个无限循环。Mattias:正如您所看到的,我正在更改onclick处理程序中复选框的状态,这是在tr上设置的。我不知道如何通过更改复选框的状态再次调用它。我的观点是,在初始化期间,某些控件可能尚未完全初始化(因此可能会有意外的值)。