Почему onchange on checkbox не срабатывает, если флажок изменен косвенно - PullRequest
5 голосов
/ 29 января 2010

Я использую 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 ]

5 голосов
/ 29 января 2010

Это не редкость в каркасах пользовательского интерфейса в целом. Если вы изменяете состояние элемента управления программно, предполагается, что вы также способны программно запускать любые побочные эффекты, которые он должен иметь. Это дает программистам больше гибкости и позволяет избежать ошибок, когда состояние изменяется во время инициализации или разрыва. (Например, во время инициализации вы можете установить состояние одного элемента управления перед установкой состояния нескольких зависимых элементов. Если обработчик изменений для первого элемента управления срабатывает немедленно, он будет выполняться, пока другие элементы управления находятся в несогласованном состоянии.) 1001 *

0 голосов
/ 03 декабря 2010

Реальная причина, по которой вы не можете этого сделать, заключается в том, что это проблема безопасности в модели программирования. События, которые не были инициированы пользователем, обычно не связаны. Поэтому, хотя установка значения - это хорошо, не стоит продолжать и запускать любые события, которые были установлены для этого элемента управления.

То, что сказал Джеймсдлин, не имеет смысла.

Jamesdlin:

"Например, во время инициализации Вы можете установить состояние одного элемента управления перед установкой состояния нескольких зависимые. Если изменить обработчик за первые контрольные огни немедленно выполнится, пока другие элементы управления находятся в противоречивом состояние. "

Это верно независимо от того, устанавливаете ли вы это программно, меняете значение или нажимаете ли вы на элемент управления. В любом случае у вас могут быть зависимые другие элементы управления.

...