Skip to content

Commit c011215

Browse files
mgolpetebacondarwin
authored andcommitted
refactor(jqLite): don't pass useCapture to add/removeEventListener
The useCapture parameter defaults to false even in oldest of our supported browsers; this is no longer needed. jQuery has removed it in 2.2 as well.
1 parent 99f7302 commit c011215

File tree

7 files changed

+80
-40
lines changed

7 files changed

+80
-40
lines changed

src/.jshintrc

-2
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,6 @@
143143
"getAliasedAttrName": false,
144144
"createEventHandler": false,
145145
"JQLitePrototype": false,
146-
"addEventListenerFn": false,
147-
"removeEventListenerFn": false,
148146
"jqLiteIsTextNode": false,
149147
"jqLiteDocumentLoaded": false,
150148

src/jqLite.js

+4-12
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1313

1414
/* global JQLitePrototype: true,
15-
addEventListenerFn: true,
16-
removeEventListenerFn: true,
1715
BOOLEAN_ATTR: true,
1816
ALIASED_ATTR: true,
1917
*/
@@ -121,13 +119,7 @@
121119
JQLite.expando = 'ng339';
122120

123121
var jqCache = JQLite.cache = {},
124-
jqId = 1,
125-
addEventListenerFn = function(element, type, fn) {
126-
element.addEventListener(type, fn, false);
127-
},
128-
removeEventListenerFn = function(element, type, fn) {
129-
element.removeEventListener(type, fn, false);
130-
};
122+
jqId = 1;
131123

132124
/*
133125
* !!! This is an undocumented "private" function !!!
@@ -325,7 +317,7 @@ function jqLiteOff(element, type, fn, unsupported) {
325317
if (!type) {
326318
for (type in events) {
327319
if (type !== '$destroy') {
328-
removeEventListenerFn(element, type, handle);
320+
element.removeEventListener(type, handle);
329321
}
330322
delete events[type];
331323
}
@@ -337,7 +329,7 @@ function jqLiteOff(element, type, fn, unsupported) {
337329
arrayRemove(listenerFns || [], fn);
338330
}
339331
if (!(isDefined(fn) && listenerFns && listenerFns.length > 0)) {
340-
removeEventListenerFn(element, type, handle);
332+
element.removeEventListener(type, handle);
341333
delete events[type];
342334
}
343335
};
@@ -874,7 +866,7 @@ forEach({
874866
eventFns = events[type] = [];
875867
eventFns.specialHandlerWrapper = specialHandlerWrapper;
876868
if (type !== '$destroy' && !noEventListener) {
877-
addEventListenerFn(element, type, handle);
869+
element.addEventListener(type, handle);
878870
}
879871
}
880872

src/ng/directive/form.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -497,13 +497,13 @@ var formDirectiveFactory = function(isNgForm) {
497497
event.preventDefault();
498498
};
499499

500-
addEventListenerFn(formElement[0], 'submit', handleFormSubmission);
500+
formElement[0].addEventListener('submit', handleFormSubmission);
501501

502502
// unregister the preventDefault listener so that we don't not leak memory but in a
503503
// way that will achieve the prevention of the default action.
504504
formElement.on('$destroy', function() {
505505
$timeout(function() {
506-
removeEventListenerFn(formElement[0], 'submit', handleFormSubmission);
506+
formElement[0].removeEventListener('submit', handleFormSubmission);
507507
}, 0, false);
508508
});
509509
}

src/ng/httpBackend.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
172172
script.async = true;
173173

174174
callback = function(event) {
175-
removeEventListenerFn(script, "load", callback);
176-
removeEventListenerFn(script, "error", callback);
175+
script.removeEventListener('load', callback);
176+
script.removeEventListener('error', callback);
177177
rawDocument.body.removeChild(script);
178178
script = null;
179179
var status = -1;
@@ -192,8 +192,8 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
192192
}
193193
};
194194

195-
addEventListenerFn(script, "load", callback);
196-
addEventListenerFn(script, "error", callback);
195+
script.addEventListener('load', callback);
196+
script.addEventListener('error', callback);
197197
rawDocument.body.appendChild(script);
198198
return callback;
199199
}

test/.jshintrc

-2
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,6 @@
117117
"getBooleanAttrName": false,
118118
"createEventHandler": false,
119119
"JQLitePrototype": false,
120-
"addEventListenerFn": false,
121-
"removeEventListenerFn": false,
122120
"jqLiteDocumentLoaded": false,
123121

124122
/* apis.js */

test/jqLiteSpec.js

+66-14
Original file line numberDiff line numberDiff line change
@@ -711,8 +711,12 @@ describe('jqLite', function() {
711711
describe('class', function() {
712712

713713
it('should properly do with SVG elements', function() {
714-
// this is a jqLite & SVG only test (jquery doesn't behave this way right now, which is a bug)
715-
if (!window.SVGElement || !_jqLiteMode) return;
714+
// This is not working correctly in jQuery prior to v3.0.
715+
// See https://github.com/jquery/jquery/issues/2199 for details.
716+
var jQueryVersion = window.jQuery && window.jQuery.fn.jquery.split('.')[0];
717+
var jQuery3xOrNewer = jQueryVersion && (Number(jQueryVersion) >= 3);
718+
if (!_jqLiteMode && !jQuery3xOrNewer) return;
719+
716720
var svg = jqLite('<svg><rect></rect></svg>');
717721
var rect = svg.children();
718722

@@ -1536,6 +1540,10 @@ describe('jqLite', function() {
15361540

15371541

15381542
describe('native listener deregistration', function() {
1543+
var jQueryVersionString = window.jQuery && window.jQuery.fn.jquery;
1544+
var jQueryMajor = jQueryVersionString && Number(jQueryVersionString.split('.')[0]);
1545+
var jQueryMinor = jQueryVersionString && Number(jQueryVersionString.split('.')[1]);
1546+
var jQuery21 = jQueryMajor === 2 && jQueryMinor === 1;
15391547

15401548
it('should deregister the native listener when all jqLite listeners for given type are gone ' +
15411549
'after off("eventName", listener) call', function() {
@@ -1547,12 +1555,22 @@ describe('jqLite', function() {
15471555
var jqLiteListener = function() {};
15481556
aElem.on('click', jqLiteListener);
15491557

1550-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1558+
// jQuery <2.2 passes the non-needed `false` useCapture parameter.
1559+
// See https://github.com/jquery/jquery/issues/2199 for details.
1560+
if (jQuery21) {
1561+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1562+
} else {
1563+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function));
1564+
}
15511565
nativeListenerFn = addEventListenerSpy.calls.mostRecent().args[1];
15521566
expect(removeEventListenerSpy).not.toHaveBeenCalled();
15531567

15541568
aElem.off('click', jqLiteListener);
1555-
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn, false);
1569+
if (jQuery21) {
1570+
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn, false);
1571+
} else {
1572+
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn);
1573+
}
15561574
});
15571575

15581576

@@ -1564,12 +1582,20 @@ describe('jqLite', function() {
15641582
var nativeListenerFn;
15651583

15661584
aElem.on('click', function() {});
1567-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1585+
if (jQuery21) {
1586+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1587+
} else {
1588+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function));
1589+
}
15681590
nativeListenerFn = addEventListenerSpy.calls.mostRecent().args[1];
15691591
expect(removeEventListenerSpy).not.toHaveBeenCalled();
15701592

15711593
aElem.off('click');
1572-
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn, false);
1594+
if (jQuery21) {
1595+
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn, false);
1596+
} else {
1597+
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn);
1598+
}
15731599
});
15741600

15751601

@@ -1581,19 +1607,32 @@ describe('jqLite', function() {
15811607
var nativeListenerFn;
15821608

15831609
aElem.on('click', function() {});
1584-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1610+
if (jQuery21) {
1611+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1612+
} else {
1613+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function));
1614+
}
15851615
nativeListenerFn = addEventListenerSpy.calls.mostRecent().args[1];
15861616
addEventListenerSpy.calls.reset();
15871617

15881618
aElem.on('dblclick', function() {});
1589-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn, false);
1619+
if (jQuery21) {
1620+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn, false);
1621+
} else {
1622+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn);
1623+
}
15901624

15911625
expect(removeEventListenerSpy).not.toHaveBeenCalled();
15921626

15931627
aElem.off('click dblclick');
15941628

1595-
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn, false);
1596-
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn, false);
1629+
if (jQuery21) {
1630+
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn, false);
1631+
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn, false);
1632+
} else {
1633+
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn);
1634+
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn);
1635+
}
15971636
expect(removeEventListenerSpy).toHaveBeenCalledTimes(2);
15981637
});
15991638

@@ -1606,17 +1645,30 @@ describe('jqLite', function() {
16061645
var nativeListenerFn;
16071646

16081647
aElem.on('click', function() {});
1609-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1648+
if (jQuery21) {
1649+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1650+
} else {
1651+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function));
1652+
}
16101653
nativeListenerFn = addEventListenerSpy.calls.mostRecent().args[1];
16111654
addEventListenerSpy.calls.reset();
16121655

16131656
aElem.on('dblclick', function() {});
1614-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn, false);
1657+
if (jQuery21) {
1658+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn, false);
1659+
} else {
1660+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn);
1661+
}
16151662

16161663
aElem.off();
16171664

1618-
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn, false);
1619-
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn, false);
1665+
if (jQuery21) {
1666+
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn, false);
1667+
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn, false);
1668+
} else {
1669+
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn);
1670+
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn);
1671+
}
16201672
expect(removeEventListenerSpy).toHaveBeenCalledTimes(2);
16211673
});
16221674
});

test/ng/directive/formSpec.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ describe('form', function() {
397397
submitted = true;
398398
};
399399

400-
addEventListenerFn(doc[0], 'submit', assertPreventDefaultListener);
400+
doc[0].addEventListener('submit', assertPreventDefaultListener);
401401

402402
browserTrigger(doc.find('input'));
403403

@@ -409,7 +409,7 @@ describe('form', function() {
409409
expect(submitted).toBe(true);
410410

411411
// prevent mem leak in test
412-
removeEventListenerFn(doc[0], 'submit', assertPreventDefaultListener);
412+
doc[0].removeEventListener('submit', assertPreventDefaultListener);
413413
})
414414
.done();
415415
job.start();
@@ -448,7 +448,7 @@ describe('form', function() {
448448

449449
$compile(doc)(scope);
450450

451-
addEventListenerFn(form[0], 'submit', assertPreventDefaultListener);
451+
form[0].addEventListener('submit', assertPreventDefaultListener);
452452

453453
browserTrigger(doc.find('button'), 'click');
454454

@@ -467,7 +467,7 @@ describe('form', function() {
467467
// now. (i)
468468

469469
// prevent mem leak in test
470-
removeEventListenerFn(form[0], 'submit', assertPreventDefaultListener);
470+
form[0].removeEventListener('submit', assertPreventDefaultListener);
471471
})
472472
.done();
473473
job.start();

0 commit comments

Comments
 (0)