Почему онконг на флажке не запускается, когда флажок косвенно изменяется

StackOverflow https://stackoverflow.com/questions/2161213

Вопрос

Я использую прототип для мониторинга флакторов, поэтому я могу добавить к ним проверки 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, оба не работают. Я не ищу обходного пути, мне просто любопытно узнать, почему это не работает.

Это было полезно?

Решение

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

Другие советы

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

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

Jamesdlin:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top