Есть ли стандарт для заказа события щелчка и изменения на флажке?
Я заметил, что порядок событий '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/