This commit is contained in:
Zihua Li 2025-03-22 13:56:57 +07:00 committed by GitHub
commit 59d1098a44
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 48 additions and 7 deletions

View File

@ -2380,18 +2380,18 @@ export abstract class Node<Config extends NodeConfig = NodeConfig> {
const topListeners = this._getProtoListeners(eventType); const topListeners = this._getProtoListeners(eventType);
if (topListeners) { if (topListeners) {
for (var i = 0; i < topListeners.length; i++) { topListeners.slice(0).forEach((listener) => {
topListeners[i].handler.call(this, evt); listener.handler.call(this, evt);
} });
} }
// it is important to iterate over self listeners without cache // it is important to iterate over self listeners without cache
// because events can be added/removed while firing // because events can be added/removed while firing
const selfListeners = this.eventListeners[eventType]; const selfListeners = this.eventListeners[eventType];
if (selfListeners) { if (selfListeners) {
for (var i = 0; i < selfListeners.length; i++) { selfListeners.slice(0).forEach((listener) => {
selfListeners[i].handler.call(this, evt); listener.handler.call(this, evt);
} });
} }
} }
/** /**

View File

@ -2004,7 +2004,7 @@ describe('Node', function () {
}); });
// ====================================================== // ======================================================
it('remove event with with callback', function () { it('remove event with callback', function () {
var stage = addStage(); var stage = addStage();
var layer = new Konva.Layer(); var layer = new Konva.Layer();
var circle = new Konva.Circle({ var circle = new Konva.Circle({
@ -2045,6 +2045,47 @@ describe('Node', function () {
assert.equal(event2, 2, 'event2 triggered twice'); assert.equal(event2, 2, 'event2 triggered twice');
}); });
// ======================================================
it('remove and add event inside callback handler', function () {
var stage = addStage();
var layer = new Konva.Layer();
var circle = new Konva.Circle();
stage.add(layer);
layer.add(circle);
layer.draw();
var event1 = 0;
var event2 = 0;
var event3 = 0;
var callback1 = function () {
event1 += 1;
circle.off('event', callback1);
circle.on('event', callback3);
};
var callback2 = function () {
event2 += 1;
};
var callback3 = function () {
event3 += 1;
};
circle.on('event', callback1);
circle.on('event', callback2);
circle.fire('event');
assert.equal(event1, 1, 'event1 triggered once');
assert.equal(event2, 1, 'event2 triggered once');
assert.equal(event3, 0, 'event2 not triggered');
circle.fire('event');
assert.equal(event1, 1, 'event1 still triggered once');
assert.equal(event2, 2, 'event2 triggered twice');
assert.equal(event3, 1, 'event3 triggered once');
});
// ====================================================== // ======================================================
it('simulate event bubble', function () { it('simulate event bubble', function () {
var stage = addStage(); var stage = addStage();