当间接更改复选框时,为什么复选框上的onchange未触发

时间:2010-01-29 10:16:45

标签: javascript prototype checkbox 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 个答案:

答案 0 :(得分:5)

这在UI框架中通常并不罕见。如果以编程方式更改控件的状态,则假定您还能够以编程方式触发它应该具有的任何副作用。它为程序员提供了更大的灵活性,并避免了在初始化或拆卸过程中状态不稳定的错误。 (例如,在初始化期间,您可以在设置几个相关控件的状态之前设置一个控件的状态。如果第一个控件的更改处理程序立即触发,它将执行而其他控件处于不一致状态。)< / p>

答案 1 :(得分:0)

你不能这样做的真正原因是因为它是编程模型中的安全问题。非用户启动的事件通常不会被链接。因此,尽管设置一个值很好,但继续并触发在该控件上设置的任何事件都不行。

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

  

Jamesdlin:

     

“例如,在初始化期间,   您可以设置一个控件的状态   在设置几个状态之前   依赖的。如果改变处理程序   对于第一次控制火灾   马上,它将执行时   其他控件不一致   状态“。

无论您是以编程方式设置更改值还是单击控件,都是如此。在任何一种情况下,您可能都依赖其他控件。