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() {