Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 4d9fc61

Browse files
committed
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 81150ac commit 4d9fc61

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
@@ -707,8 +707,12 @@ describe('jqLite', function() {
707707
describe('class', function() {
708708

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

@@ -1532,6 +1536,10 @@ describe('jqLite', function() {
15321536

15331537

15341538
describe('native listener deregistration', function() {
1539+
var jQueryVersionString = window.jQuery && window.jQuery.fn.jquery;
1540+
var jQueryMajor = jQueryVersionString && Number(jQueryVersionString.split('.')[0]);
1541+
var jQueryMinor = jQueryVersionString && Number(jQueryVersionString.split('.')[1]);
1542+
var jQuery21 = jQueryMajor === 2 && jQueryMinor === 1;
15351543

15361544
it('should deregister the native listener when all jqLite listeners for given type are gone ' +
15371545
'after off("eventName", listener) call', function() {
@@ -1543,12 +1551,22 @@ describe('jqLite', function() {
15431551
var jqLiteListener = function() {};
15441552
aElem.on('click', jqLiteListener);
15451553

1546-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1554+
// jQuery <2.2 passes the non-needed `false` useCapture parameter.
1555+
// See https://github.com/jquery/jquery/issues/2199 for details.
1556+
if (jQuery21) {
1557+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1558+
} else {
1559+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function));
1560+
}
15471561
nativeListenerFn = addEventListenerSpy.mostRecentCall.args[1];
15481562
expect(removeEventListenerSpy).not.toHaveBeenCalled();
15491563

15501564
aElem.off('click', jqLiteListener);
1551-
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn, false);
1565+
if (jQuery21) {
1566+
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn, false);
1567+
} else {
1568+
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn);
1569+
}
15521570
});
15531571

15541572

@@ -1560,12 +1578,20 @@ describe('jqLite', function() {
15601578
var nativeListenerFn;
15611579

15621580
aElem.on('click', function() {});
1563-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1581+
if (jQuery21) {
1582+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1583+
} else {
1584+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function));
1585+
}
15641586
nativeListenerFn = addEventListenerSpy.mostRecentCall.args[1];
15651587
expect(removeEventListenerSpy).not.toHaveBeenCalled();
15661588

15671589
aElem.off('click');
1568-
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn, false);
1590+
if (jQuery21) {
1591+
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn, false);
1592+
} else {
1593+
expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn);
1594+
}
15691595
});
15701596

15711597

@@ -1577,19 +1603,32 @@ describe('jqLite', function() {
15771603
var nativeListenerFn;
15781604

15791605
aElem.on('click', function() {});
1580-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1606+
if (jQuery21) {
1607+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1608+
} else {
1609+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function));
1610+
}
15811611
nativeListenerFn = addEventListenerSpy.mostRecentCall.args[1];
15821612
addEventListenerSpy.reset();
15831613

15841614
aElem.on('dblclick', function() {});
1585-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn, false);
1615+
if (jQuery21) {
1616+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn, false);
1617+
} else {
1618+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn);
1619+
}
15861620

15871621
expect(removeEventListenerSpy).not.toHaveBeenCalled();
15881622

15891623
aElem.off('click dblclick');
15901624

1591-
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn, false);
1592-
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn, false);
1625+
if (jQuery21) {
1626+
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn, false);
1627+
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn, false);
1628+
} else {
1629+
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn);
1630+
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn);
1631+
}
15931632
expect(removeEventListenerSpy.callCount).toBe(2);
15941633
});
15951634

@@ -1602,17 +1641,30 @@ describe('jqLite', function() {
16021641
var nativeListenerFn;
16031642

16041643
aElem.on('click', function() {});
1605-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1644+
if (jQuery21) {
1645+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false);
1646+
} else {
1647+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function));
1648+
}
16061649
nativeListenerFn = addEventListenerSpy.mostRecentCall.args[1];
16071650
addEventListenerSpy.reset();
16081651

16091652
aElem.on('dblclick', function() {});
1610-
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn, false);
1653+
if (jQuery21) {
1654+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn, false);
1655+
} else {
1656+
expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn);
1657+
}
16111658

16121659
aElem.off();
16131660

1614-
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn, false);
1615-
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn, false);
1661+
if (jQuery21) {
1662+
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn, false);
1663+
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn, false);
1664+
} else {
1665+
expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn);
1666+
expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn);
1667+
}
16161668
expect(removeEventListenerSpy.callCount).toBe(2);
16171669
});
16181670
});

test/ng/directive/formSpec.js

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

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

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

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

412412
// prevent mem leak in test
413-
removeEventListenerFn(doc[0], 'submit', assertPreventDefaultListener);
413+
doc[0].removeEventListener('submit', assertPreventDefaultListener);
414414
});
415415
});
416416

@@ -447,7 +447,7 @@ describe('form', function() {
447447

448448
$compile(doc)(scope);
449449

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

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

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

468468
// prevent mem leak in test
469-
removeEventListenerFn(form[0], 'submit', assertPreventDefaultListener);
469+
form[0].removeEventListener('submit', assertPreventDefaultListener);
470470
});
471471
}));
472472

0 commit comments

Comments
 (0)