Keep track of the number of events we have registered.

This is needed to reliably prevent the handleBrowserEvent method to perform potentially expensive calculations.
This commit is contained in:
ahocevar
2012-06-24 20:03:16 +02:00
parent d8599f28b9
commit 1b93856e89
2 changed files with 19 additions and 5 deletions
+14 -5
View File
@@ -108,6 +108,12 @@ ol.event.Events = function(object, opt_element, opt_includeXY, opt_sequences) {
*/ */
this.sequences_ = []; this.sequences_ = [];
/**
* @private
* @type {Object}
*/
this.listenerCount_ = {};
if (goog.isDef(opt_element)) { if (goog.isDef(opt_element)) {
this.setElement(opt_element); this.setElement(opt_element);
} }
@@ -209,6 +215,7 @@ ol.event.Events.prototype.register = function(type, listener, opt_scope,
goog.events.listen( goog.events.listen(
this, type, listener, opt_priority, opt_scope || this.object_ this, type, listener, opt_priority, opt_scope || this.object_
); );
this.listenerCount_[type] = (this.listenerCount_[type] || 0) + 1;
}; };
/** /**
@@ -224,9 +231,12 @@ ol.event.Events.prototype.register = function(type, listener, opt_scope,
*/ */
ol.event.Events.prototype.unregister = function(type, listener, opt_scope, ol.event.Events.prototype.unregister = function(type, listener, opt_scope,
opt_priority) { opt_priority) {
goog.events.unlisten( var removed = goog.events.unlisten(
this, type, listener, opt_priority, opt_scope || this.object_ this, type, listener, opt_priority, opt_scope || this.object_
); );
if (removed) {
this.listenerCount_[type] = (this.listenerCount_[type] || 1) - 1;
}
}; };
/** /**
@@ -266,10 +276,9 @@ ol.event.Events.prototype.triggerEvent = function(type, opt_evt) {
* @param {Event} evt Event object. * @param {Event} evt Event object.
*/ */
ol.event.Events.prototype.handleBrowserEvent = function(evt) { ol.event.Events.prototype.handleBrowserEvent = function(evt) {
var type = evt.type, var me = ol.event.Events.prototype.handleBrowserEvent,
listeners = goog.events.getListeners(this.element_, type, false) type = evt.type;
.concat(goog.events.getListeners(this.element_, type, true)); if (this.listenerCount_[type] > 0) {
if (listeners && listeners.length > 0) {
// add clientX & clientY to all events - corresponds to average x, y // add clientX & clientY to all events - corresponds to average x, y
var touches = evt.touches; var touches = evt.touches;
if (touches && touches[0]) { if (touches && touches[0]) {
+5
View File
@@ -114,6 +114,8 @@ describe("ol.event.Events", function() {
log = []; log = [];
events.register("bar", logFn); events.register("bar", logFn);
expect(events.listenerCount_["bar"]).toBe(1);
events.triggerEvent("bar"); events.triggerEvent("bar");
expect(log.length).toBe(1); expect(log.length).toBe(1);
@@ -121,6 +123,9 @@ describe("ol.event.Events", function() {
events.triggerEvent("bar"); events.triggerEvent("bar");
expect(log.length).toBe(1); expect(log.length).toBe(1);
events.unregister("bar", logFn);
expect(events.listenerCount_["bar"]).toBe(0);
events.destroy(); events.destroy();
}); });