Есть ли стандарт для заказа события щелчка и изменения на флажке?

Я заметил, что порядок событий 'click' и 'change' отличается в Chrome и Firefox.

См. этот JSFiddle, например: http://jsfiddle.net/5jz2g/3/

JavaScript:

var el = $('foo');
var fn = function(e) {
    console.log(e.type);
}
el.addEvent('change', fn);
el.addEvent('click', fn);

В Chrome эти журналы:

change
click

И в Firefox эти журналы:

click
change

Есть ли стандарт для порядка событий? Который должен стрелять первым? MDN, похоже, не упоминает об этом, и я не мог найти ничего об этом в документах W3C.

Ответы

Ответ 1

Документ DOM3 Events содержит рекомендацию относительно порядка событий. В соответствии с этим в случае флажка правильный порядок будет click, а затем change, а не наоборот, потому что событие change, очевидно, является частью действия по умолчанию для флажка, см. Пример 5 и fiddle, который работает как ожидается в FF, но не в Chrome. Во всяком случае, это логично. Но! Пусть внимательно прочитайте раздел действий по умолчанию:

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

Вы видели это? W3C использует слова RFC СЛЕДУЕТ и МОЖЕТ в одном предложении! Нечего делать, они осторожные парни. ИМО, почему мы имеем то, что имеем:)

Ответ 2

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

Ответ 3

попробуйте это

$(function(){

    var $select = $('foo');
    var store = function(e) {
        console.log(e.type);
    };

    $select.addEvent('change', store).addEvent('click', store);

});

http://jsfiddle.net/donddoug/Du7z5/

Ответ 4

Не удалось найти способ синхронизации событий через браузер...

следующее работает в том же порядке как в FF, так и в Chrome;

Код JavaScript (используйте mouseup/mousedown, чтобы поймать "click"):

var el = $('foo');
var fn = function(e) {
    console.log(e.type);
}
el.addEvent('change', fn);
el.addEvent('mouseup', fn);

http://jsfiddle.net/5jz2g/17/