我正在使用原型监视复选框,因此我可以向他们添加JavaScript检查。当单击复选框的TR或TD时,应检查复选框。
当您直接在复选框上单击时,就会发射Onchange事件,因此您将获得警报。当通过JavaScript更改复选框的值(当您单击TR或TD时)时,请未触发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框架中并不少见。如果您以编程方式更改控件的状态,则假定您还可以通过编程方式触发它应该具有的任何副作用。它为程序员提供了更大的灵活性,并且避免了在初始化或拆除期间状态在状态中处于不断变化的位置。 (例如,在初始化期间,您可以在设置几个依赖的状态之前设置一个控件的状态。如果立即进行第一个控制射击的更改处理程序,则在其他控件处于不一致的状态时,它将执行。)

其他提示

您不能这样做的真正原因是因为它是编程模型中的安全问题。通常没有启动用户的事件通常不会链接。因此,尽管设置值是可以的,但是继续进行该控件上设置的任何事件并不是很好。

詹姆斯德林说的话没有道理。

詹姆斯德林:

“例如,在初始化期间,您可能会在设置几个依赖的状态之前设置一个控件的状态。如果立即进行第一个控制射击的更改处理程序,则在其他控件处于不一致状态时,它将执行。”

无论您是通过编程性更改值还是单击控件,这都是真的。无论哪种情况,您都可能具有其他控件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top