diff --git a/src/standard/events.html b/src/standard/events.html index 926c31b311..2d7bba14b3 100644 --- a/src/standard/events.html +++ b/src/standard/events.html @@ -85,7 +85,12 @@ if (!handler) { handler = this._createEventHandler(node, eventName, methodName); } + // don't call _listen if we are already listening + if (handler._listening) { + return; + } this._listen(node, eventName, handler); + handler._listening = true; }, _boundListenerKey: function(eventName, methodName) { @@ -129,6 +134,7 @@ methodName + '` not defined')); } }; + handler._listening = false; this._recordEventHandler(host, eventName, node, methodName, handler); return handler; }, @@ -148,6 +154,7 @@ var handler = this._recallEventHandler(this, eventName, node, methodName); if (handler) { this._unlisten(node, eventName, handler); + handler._listening = false; } }, diff --git a/test/unit/events.html b/test/unit/events.html index d771147ebf..3ffb474547 100644 --- a/test/unit/events.html +++ b/test/unit/events.html @@ -153,6 +153,11 @@ document.body.removeChild(el); }); + test('listen marks event handler as listening', function() { + var handler = el._recallEventHandler(el, 'foo', el, 'missing'); + assert.equal(handler._listening, true, 'handler should be marked'); + }); + test('Event handler fires only once', function() { el.fire('foo'); assert.equal(el._warned.length, 1, 'event should fire only once'); @@ -171,9 +176,14 @@ assert.ok(fn, 'should be cached'); }); + test('unlisten markes cached handler as not listening', function() { + var handler = el._recallEventHandler(el, 'foo', el, 'missing'); + assert.equal(handler._listening, false, 'handler should not be listening'); + }); + test('once unlistened, no handler fire', function() { el.fire('foo'); - assert.equal(el._warned.length, 1, 'event should not be handled anymore') + assert.equal(el._warned.length, 1, 'event should not be handled anymore'); }); }); });