Idealmente, se o Evento1 for disparado antes do Evento2, todos os manipuladores do Evento2 devem ser executados depois que todos os manipuladores do Evento1 terminarem. No entanto, esse não é o caso em HTML ou jQuery. Escrevi um Jasmine Spec com falha para demonstrar isso:
describe('A jquery element', function() {
it('should invoke handlers in the order of events triggered from it', function() {
var tokens = [];
var elem = document.createElement('div');
function e1Handler1(payload) {
tokens.push('e1Handler1');
$(elem).trigger('Event2');
}
function e1Handler2(payload) {tokens.push('e1Handler2');}
function e2Handler1(payload) {tokens.push('e2Handler1');}
$(elem).bind('Event1', e1Handler1);
$(elem).bind('Event1', e1Handler2);
$(elem).bind('Event2', e2Handler1);
$(elem).trigger('Event1', {});
expect(tokens).toBe(['e1Handler1', 'e1Handler2', 'e2Handler1']);
});
});
describe('An HTML element', function() {
it('should invoke handlers in the order of events triggered from it', function() {
var tokens = [];
var elem = document.createElement('div');
var e1 = new CustomEvent('Event1');
var e2 = new CustomEvent('Event2');
function e1Handler1(payload) {
tokens.push('e1Handler1');
elem.dispatchEvent(e2);
}
function e1Handler2(payload) {tokens.push('e1Handler2');}
function e2Handler1(payload) {tokens.push('e2Handler1');}
elem.addEventListener('Event1', e1Handler1);
elem.addEventListener('Event1', e1Handler2);
elem.addEventListener('Event2', e2Handler1);
elem.dispatchEvent(e1);
expect(tokens).toBe(['e1Handler1', 'e1Handler2', 'e2Handler1']);
});
});