diff --git a/iron-scroll-target-behavior.html b/iron-scroll-target-behavior.html index 0d0a8b1..8d5172b 100644 --- a/iron-scroll-target-behavior.html +++ b/iron-scroll-target-behavior.html @@ -73,12 +73,16 @@ '_scrollTargetChanged(scrollTarget, isAttached)' ], + /** + * True if the event listener should be installed. + */ + _shouldHaveListener: true, + _scrollTargetChanged: function(scrollTarget, isAttached) { - var eventTarget; + var eventTarget, hasListener = this._shouldHaveListener; if (this._oldScrollTarget) { - eventTarget = this._oldScrollTarget === this._doc ? window : this._oldScrollTarget; - eventTarget.removeEventListener('scroll', this._boundScrollHandler); + this._enableScrollListener(false, this._oldScrollTarget); this._oldScrollTarget = null; } @@ -97,11 +101,10 @@ } else if (this._isValidScrollTarget()) { - eventTarget = scrollTarget === this._doc ? window : scrollTarget; this._boundScrollHandler = this._boundScrollHandler || this._scrollHandler.bind(this); this._oldScrollTarget = scrollTarget; + this._enableScrollListener(hasListener, scrollTarget); - eventTarget.addEventListener('scroll', this._boundScrollHandler); } }, @@ -228,7 +231,28 @@ */ _isValidScrollTarget: function() { return this.scrollTarget instanceof HTMLElement; + }, + + /** + * Enables or disables the scroll event listener + * + * @param {boolean} yes True to add the event, False to remove it + * @param {HTMLElement} scrollTarget The scroll target + */ + _enableScrollListener: function(yes, scrollTarget) { + if (!this._boundScrollHandler) { + return; + } + var eventTarget = scrollTarget === this._doc ? window : scrollTarget; + + if (yes) { + eventTarget.addEventListener('scroll', this._boundScrollHandler); + } else { + eventTarget.removeEventListener('scroll', this._boundScrollHandler); + } + this._shouldHaveListener = yes; } + }; diff --git a/test/basic.html b/test/basic.html index 5ca98b5..cbaade2 100644 --- a/test/basic.html +++ b/test/basic.html @@ -94,6 +94,25 @@ done(); }); }); + + test('_enableScrollListener', function(done) { + flush(function() { + xScroll._scrollHandler = sinon.spy(); + xScroll.scrollTarget = 'temporaryScrollingRegion'; + xScroll.scroll(0, 100); + xScroll._enableScrollListener(true, xScroll.scrollTarget); + setTimeout(function() { + assert.isTrue(xScroll._scrollHandler.called, '_scrollHandler should be called'); + xScroll._scrollHandler.reset(); + xScroll._enableScrollListener(false, xScroll.scrollTarget); + xScroll.scroll(0, 200); + setTimeout(function() { + assert.isFalse(xScroll._scrollHandler.called, '_scrollHandler should not be called'); + done(); + }, 100); + }, 100); + }); + }); }); suite('scrolling region', function() {