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');
});
});
});