mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-04-24 03:55:49 +08:00
fix(jqLite): fix event.stopImmediatePropagation() so it works as expected
jqLite doesn't override the default implementation of event.stopImmediatePropagation() and so it doesn't work as expected, i.e, it doesn't prevent the rest of the event handlers from being executed. Closes #4833
This commit is contained in:
committed by
Michał Gołębiowski
parent
19871d28cf
commit
30354c58fe
@@ -1102,6 +1102,58 @@ describe('jqLite', function() {
|
||||
browserTrigger(a, 'click');
|
||||
});
|
||||
|
||||
it('should stop triggering handlers when stopImmediatePropagation is called', function() {
|
||||
var element = jqLite(a),
|
||||
clickSpy1 = jasmine.createSpy('clickSpy1'),
|
||||
clickSpy2 = jasmine.createSpy('clickSpy2').andCallFake(function(event) { event.stopImmediatePropagation(); }),
|
||||
clickSpy3 = jasmine.createSpy('clickSpy3'),
|
||||
clickSpy4 = jasmine.createSpy('clickSpy4');
|
||||
|
||||
element.on('click', clickSpy1);
|
||||
element.on('click', clickSpy2);
|
||||
element.on('click', clickSpy3);
|
||||
element[0].addEventListener('click', clickSpy4);
|
||||
|
||||
browserTrigger(element, 'click');
|
||||
|
||||
expect(clickSpy1).toHaveBeenCalled();
|
||||
expect(clickSpy2).toHaveBeenCalled();
|
||||
expect(clickSpy3).not.toHaveBeenCalled();
|
||||
expect(clickSpy4).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should execute stopPropagation when stopImmediatePropagation is called', function() {
|
||||
var element = jqLite(a),
|
||||
clickSpy = jasmine.createSpy('clickSpy');
|
||||
|
||||
clickSpy.andCallFake(function(event) {
|
||||
spyOn(event, 'stopPropagation');
|
||||
event.stopImmediatePropagation();
|
||||
expect(event.stopPropagation).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
element.on('click', clickSpy);
|
||||
|
||||
browserTrigger(element, 'click');
|
||||
expect(clickSpy).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should have event.isImmediatePropagationStopped method', function() {
|
||||
var element = jqLite(a),
|
||||
clickSpy = jasmine.createSpy('clickSpy');
|
||||
|
||||
clickSpy.andCallFake(function(event) {
|
||||
expect(event.isImmediatePropagationStopped()).toBe(false);
|
||||
event.stopImmediatePropagation();
|
||||
expect(event.isImmediatePropagationStopped()).toBe(true);
|
||||
});
|
||||
|
||||
element.on('click', clickSpy);
|
||||
|
||||
browserTrigger(element, 'click');
|
||||
expect(clickSpy).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
describe('mouseenter-mouseleave', function() {
|
||||
var root, parent, sibling, child, log;
|
||||
|
||||
@@ -1784,7 +1836,6 @@ describe('jqLite', function() {
|
||||
expect(event.isDefaultPrevented()).toBe(true);
|
||||
});
|
||||
|
||||
|
||||
it('should support handlers that deregister themselves', function() {
|
||||
var element = jqLite('<a>poke</a>'),
|
||||
clickSpy = jasmine.createSpy('click'),
|
||||
@@ -1821,6 +1872,37 @@ describe('jqLite', function() {
|
||||
expect(actualEvent.target).toEqual(element[0]);
|
||||
expect(actualEvent.type).toEqual('click');
|
||||
});
|
||||
|
||||
it('should stop triggering handlers when stopImmediatePropagation is called', function () {
|
||||
var element = jqLite(a),
|
||||
clickSpy1 = jasmine.createSpy('clickSpy1'),
|
||||
clickSpy2 = jasmine.createSpy('clickSpy2').andCallFake(function(event) { event.stopImmediatePropagation(); }),
|
||||
clickSpy3 = jasmine.createSpy('clickSpy3');
|
||||
|
||||
element.on('click', clickSpy1);
|
||||
element.on('click', clickSpy2);
|
||||
element.on('click', clickSpy3);
|
||||
|
||||
element.triggerHandler('click');
|
||||
|
||||
expect(clickSpy1).toHaveBeenCalled();
|
||||
expect(clickSpy2).toHaveBeenCalled();
|
||||
expect(clickSpy3).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should have event.isImmediatePropagationStopped method', function() {
|
||||
var element = jqLite(a),
|
||||
clickSpy = jasmine.createSpy('clickSpy'),
|
||||
event;
|
||||
|
||||
element.on('click', clickSpy);
|
||||
element.triggerHandler('click');
|
||||
event = clickSpy.mostRecentCall.args[0];
|
||||
|
||||
expect(event.isImmediatePropagationStopped()).toBe(false);
|
||||
event.stopImmediatePropagation();
|
||||
expect(event.isImmediatePropagationStopped()).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user