From 53e7c4ee56725897a3159e28621735aca4d7206d Mon Sep 17 00:00:00 2001 From: Tom Spencer Date: Wed, 2 Dec 2015 19:43:31 +0000 Subject: [PATCH 1/2] Added a cleanup method to Imager prototype --- Imager.js | 53 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/Imager.js b/Imager.js index 19d3c1b..a1ed4d5 100644 --- a/Imager.js +++ b/Imager.js @@ -14,6 +14,19 @@ } })(); + var removeEvent = (function () { + if (document.removeEventListener) { + return function removeStandardEventListener(el, eventName, fn) { + return el.removeEventListener(eventName, fn, false); + }; + } + else { + return function removeIEEventListener(el, eventName, fn) { + return el.detachEvent('on' + eventName, fn); + }; + } + })(); + var defaultWidths = [96, 130, 165, 200, 235, 270, 304, 340, 375, 410, 445, 485, 520, 555, 590, 625, 660, 695, 736]; var getKeys = typeof Object.keys === 'function' ? Object.keys : function (object) { @@ -144,6 +157,8 @@ } this.divs = []; + this.scrollListeners = []; + this.resizeListeners = []; this.add(elements || this.selector); this.ready(opts.onReady); @@ -424,9 +439,12 @@ Imager.prototype.registerResizeEvent = function (filterFn) { var self = this; - addEvent(window, 'resize', debounce(function () { + var resizeListener = debounce(function () { self.checkImagesNeedReplacing(self.divs, filterFn); - }, 100)); + }, 100); + + addEvent(window, 'resize', resizeListener); + this.resizeListeners.push(resizeListener); }; Imager.prototype.registerScrollEvent = function () { @@ -438,14 +456,37 @@ self.scrollCheck(); }, self.scrollDelay); - addEvent(window, 'scroll', function () { + var onScroll = function () { self.scrolled = true; - }); + }; - addEvent(window, 'resize', function () { + var onResize = function () { self.viewportHeight = document.documentElement.clientHeight; self.scrolled = true; - }); + }; + + addEvent(window, 'scroll', onScroll); + addEvent(window, 'resize', onResize); + + this.scrollListeners.push(onScroll); + this.resizeListeners.push(onResize); + }; + + Imager.prototype.cleanup = function () { + applyEach(this.resizeListeners, function(listener) { + removeEvent(window, 'resize', listener); + }); + applyEach(this.scrollListeners, function(listener) { + removeEvent(window, 'scroll', listener); + }); + + if(this.interval) { + window.clearInterval(this.interval); + } + + this.resizeListeners = []; + this.scrollListeners = []; + this.interval = null; }; Imager.getPageOffsetGenerator = function getPageVerticalOffset(testCase) { From 1749b4f2a71380d531f7c0a820c19b28c61f9ced Mon Sep 17 00:00:00 2001 From: Tom Spencer Date: Tue, 12 Jan 2016 17:13:37 +0000 Subject: [PATCH 2/2] Add tests for cleanup method --- test/fixtures/cleanup.html | 4 +++ test/unit/core.js | 68 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 test/fixtures/cleanup.html diff --git a/test/fixtures/cleanup.html b/test/fixtures/cleanup.html new file mode 100644 index 0000000..cf5eb18 --- /dev/null +++ b/test/fixtures/cleanup.html @@ -0,0 +1,4 @@ +
+
+
+
diff --git a/test/unit/core.js b/test/unit/core.js index deaf5e9..317843c 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -231,6 +231,74 @@ describe('Imager.js', function () { }); }); + describe('cleanup', function() { + var removeEvtStub, getExpectedEvtName; + + beforeEach(function() { + if(document.removeEventListener) { + removeEvtStub = sandbox.stub(window, 'removeEventListener'); + getExpectedEvtName = function(name) { + return name; + }; + + } else { + removeEvtStub = sandbox.stub(window, 'detachEvent'); + getExpectedEvtName = function(name) { + return 'on' + name; + }; + } + }); + + it('should cleanup after using onResize option', function(done) { + fixtures = loadFixtures('cleanup'); + var imgr = new Imager({ + onResize: true + }); + imgr.ready(function () { + expect(imgr.resizeListeners.length).to.be(1); + expect(imgr.scrollListeners.length).to.be(0); + + imgr.cleanup(); + + expect(imgr.resizeListeners.length).to.be(0); + expect(imgr.scrollListeners.length).to.be(0); + + expect(removeEvtStub.called).to.be(true); + expect(removeEvtStub.callCount).to.be(1); + expect(removeEvtStub.firstCall.args[0]).to.be(getExpectedEvtName('resize')); + done(); + }); + }); + + it('should cleanup after using lazyload option', function(done) { + sandbox.stub(window, 'clearInterval'); + fixtures = loadFixtures('cleanup'); + var imgr = new Imager({ + lazyload: true + }); + imgr.ready(function () { + expect(imgr.resizeListeners.length).to.be(2); + expect(imgr.scrollListeners.length).to.be(1); + expect(imgr.interval).to.be.defined; + + imgr.cleanup(); + + expect(imgr.resizeListeners.length).to.be(0); + expect(imgr.scrollListeners.length).to.be(0); + expect(imgr.interval).to.be.null; + + expect(removeEvtStub.called).to.be(true); + expect(removeEvtStub.callCount).to.be(3); + expect(removeEvtStub.firstCall.args[0]).to.be(getExpectedEvtName('resize')); + expect(removeEvtStub.secondCall.args[0]).to.be(getExpectedEvtName('resize')); + expect(removeEvtStub.thirdCall.args[0]).to.be(getExpectedEvtName('scroll')); + expect(window.clearInterval.called).to.be(true); + + done(); + }); + }); + }); + describe('isThisElementOnScreen', function(){ var offsetStub, imgr;