only propagate events if given true to fire, #2311
This commit is contained in:
parent
ce4a031d40
commit
6d1142a978
@ -381,4 +381,36 @@ describe('Events', function () {
|
|||||||
expect(spy.called).to.be(true);
|
expect(spy.called).to.be(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('addEventParent && removeEventParent', function () {
|
||||||
|
it('makes the object propagate events with to the given one if fired with propagate=true', function () {
|
||||||
|
var obj = new L.Evented(),
|
||||||
|
parent1 = new L.Evented(),
|
||||||
|
parent2 = new L.Evented(),
|
||||||
|
spy1 = sinon.spy(),
|
||||||
|
spy2 = sinon.spy();
|
||||||
|
|
||||||
|
parent1.on('test', spy1);
|
||||||
|
parent2.on('test', spy2);
|
||||||
|
|
||||||
|
obj.addEventParent(parent1).addEventParent(parent2);
|
||||||
|
|
||||||
|
obj.fire('test');
|
||||||
|
|
||||||
|
expect(spy1.called).to.be(false);
|
||||||
|
expect(spy2.called).to.be(false);
|
||||||
|
|
||||||
|
obj.fire('test', null, true);
|
||||||
|
|
||||||
|
expect(spy1.called).to.be(true);
|
||||||
|
expect(spy2.called).to.be(true);
|
||||||
|
|
||||||
|
obj.removeEventParent(parent1);
|
||||||
|
|
||||||
|
obj.fire('test', null, true);
|
||||||
|
|
||||||
|
expect(spy1.callCount).to.be(1);
|
||||||
|
expect(spy2.callCount).to.be(2);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
wasClicked1 = true;
|
wasClicked1 = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
marker.fire('click', { type: 'click' });
|
marker.fire('click', {type: 'click'}, true);
|
||||||
|
|
||||||
expect(wasClicked1).to.be(true);
|
expect(wasClicked1).to.be(true);
|
||||||
expect(wasClicked2).to.be(true);
|
expect(wasClicked2).to.be(true);
|
||||||
|
@ -126,8 +126,8 @@ L.Evented = L.Class.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
fire: function (type, data) {
|
fire: function (type, data, propagate) {
|
||||||
if (!this.hasEventListeners(type)) {
|
if (!this.hasEventListeners(type, propagate)) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,19 +161,23 @@ L.Evented = L.Class.extend({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._propagateEvent(event);
|
if (propagate) {
|
||||||
|
this._propagateEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
hasEventListeners: function (type) {
|
hasEventListeners: function (type, propagate) {
|
||||||
var events = this[eventsKey];
|
var events = this[eventsKey];
|
||||||
if (events && ((type in events && events[type].length > 0) ||
|
if (events && ((type in events && events[type].length > 0) ||
|
||||||
(type + '_idx' in events && events[type + '_idx_len'] > 0))) {
|
(type + '_idx' in events && events[type + '_idx_len'] > 0))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
for (var id in this._eventParents) {
|
if (propagate) {
|
||||||
if (this._eventParents[id].hasEventListeners(type)) { return true; }
|
for (var id in this._eventParents) {
|
||||||
|
if (this._eventParents[id].hasEventListeners(type)) { return true; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
@ -206,12 +210,14 @@ L.Evented = L.Class.extend({
|
|||||||
addEventParent: function (obj) {
|
addEventParent: function (obj) {
|
||||||
this._eventParents = this._eventParents || {};
|
this._eventParents = this._eventParents || {};
|
||||||
this._eventParents[L.stamp(obj)] = obj;
|
this._eventParents[L.stamp(obj)] = obj;
|
||||||
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
removeEventParent: function (obj) {
|
removeEventParent: function (obj) {
|
||||||
if (this._eventParents) {
|
if (this._eventParents) {
|
||||||
delete this._eventParents[L.stamp(obj)];
|
delete this._eventParents[L.stamp(obj)];
|
||||||
}
|
}
|
||||||
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
_propagateEvent: function (e) {
|
_propagateEvent: function (e) {
|
||||||
|
@ -54,7 +54,7 @@ L.Popup = L.Layer.extend({
|
|||||||
map.fire('popupopen', {popup: this});
|
map.fire('popupopen', {popup: this});
|
||||||
|
|
||||||
if (this._source) {
|
if (this._source) {
|
||||||
this._source.fire('popupopen', {popup: this});
|
this._source.fire('popupopen', {popup: this}, true);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ L.Popup = L.Layer.extend({
|
|||||||
map.fire('popupclose', {popup: this});
|
map.fire('popupclose', {popup: this});
|
||||||
|
|
||||||
if (this._source) {
|
if (this._source) {
|
||||||
this._source.fire('popupclose', {popup: this});
|
this._source.fire('popupclose', {popup: this}, true);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -257,7 +257,7 @@ L.Marker = L.Layer.extend({
|
|||||||
this.fire(e.type, {
|
this.fire(e.type, {
|
||||||
originalEvent: e,
|
originalEvent: e,
|
||||||
latlng: this._latlng
|
latlng: this._latlng
|
||||||
});
|
}, true);
|
||||||
|
|
||||||
// TODO proper custom event propagation
|
// TODO proper custom event propagation
|
||||||
// this line will always be called if marker is in a FeatureGroup
|
// this line will always be called if marker is in a FeatureGroup
|
||||||
|
@ -89,7 +89,7 @@ L.Path = L.Layer.extend({
|
|||||||
layerPoint: layerPoint,
|
layerPoint: layerPoint,
|
||||||
containerPoint: containerPoint,
|
containerPoint: containerPoint,
|
||||||
originalEvent: e
|
originalEvent: e
|
||||||
});
|
}, true);
|
||||||
|
|
||||||
if (type === 'contextmenu') {
|
if (type === 'contextmenu') {
|
||||||
L.DomEvent.preventDefault(e);
|
L.DomEvent.preventDefault(e);
|
||||||
|
Loading…
Reference in New Issue
Block a user