mirror of
https://github.com/konvajs/konva.git
synced 2025-04-05 20:48:28 +08:00
Merge pull request #112 from davonium/on_off
Off can remove all listeners in the same name space by .off(".foobar")
This commit is contained in:
commit
67d3507925
36
dist/kinetic-core.js
vendored
36
dist/kinetic-core.js
vendored
@ -3,7 +3,7 @@
|
||||
* http://www.kineticjs.com/
|
||||
* Copyright 2012, Eric Rowell
|
||||
* Licensed under the MIT or GPL Version 2 licenses.
|
||||
* Date: Oct 03 2012
|
||||
* Date: Oct 04 2012
|
||||
*
|
||||
* Copyright (C) 2011 - 2012 by Eric Rowell
|
||||
*
|
||||
@ -1341,7 +1341,8 @@ Kinetic.Node.prototype = {
|
||||
* event types delimmited by a space to remove multiple event
|
||||
* bindings at once such as 'mousedown mouseup mousemove'.
|
||||
* include a namespace to remove an event binding by name
|
||||
* such as 'click.foobar'.
|
||||
* such as 'click.foobar'. If you only give a name like '.foobar',
|
||||
* all events in that namespace will be removed.
|
||||
* @name off
|
||||
* @methodOf Kinetic.Node.prototype
|
||||
* @param {String} typesStr
|
||||
@ -1356,17 +1357,14 @@ Kinetic.Node.prototype = {
|
||||
var parts = event.split('.');
|
||||
var baseEvent = parts[0];
|
||||
|
||||
if(this.eventListeners[baseEvent] && parts.length > 1) {
|
||||
var name = parts[1];
|
||||
|
||||
for(var i = 0; i < this.eventListeners[baseEvent].length; i++) {
|
||||
if(this.eventListeners[baseEvent][i].name === name) {
|
||||
this.eventListeners[baseEvent].splice(i, 1);
|
||||
if(this.eventListeners[baseEvent].length === 0) {
|
||||
delete this.eventListeners[baseEvent];
|
||||
break;
|
||||
}
|
||||
i--;
|
||||
if(parts.length > 1) {
|
||||
if (baseEvent){
|
||||
if (this.eventListeners[baseEvent]) {
|
||||
this._off(baseEvent, parts[1]);
|
||||
}
|
||||
} else {
|
||||
for(var type in this.eventListeners) {
|
||||
this._off(type, parts[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2035,6 +2033,18 @@ Kinetic.Node.prototype = {
|
||||
this.setAttr('scale', pos);
|
||||
|
||||
},
|
||||
_off: function(type, name) {
|
||||
for(var i = 0; i < this.eventListeners[type].length; i++) {
|
||||
if(this.eventListeners[type][i].name === name) {
|
||||
this.eventListeners[type].splice(i, 1);
|
||||
if(this.eventListeners[type].length === 0) {
|
||||
delete this.eventListeners[type];
|
||||
break;
|
||||
}
|
||||
i--;
|
||||
}
|
||||
}
|
||||
},
|
||||
_clearTransform: function() {
|
||||
var trans = {
|
||||
x: this.attrs.x,
|
||||
|
8
dist/kinetic-core.min.js
vendored
8
dist/kinetic-core.min.js
vendored
File diff suppressed because one or more lines are too long
34
src/Node.js
34
src/Node.js
@ -118,7 +118,8 @@ Kinetic.Node.prototype = {
|
||||
* event types delimmited by a space to remove multiple event
|
||||
* bindings at once such as 'mousedown mouseup mousemove'.
|
||||
* include a namespace to remove an event binding by name
|
||||
* such as 'click.foobar'.
|
||||
* such as 'click.foobar'. If you only give a name like '.foobar',
|
||||
* all events in that namespace will be removed.
|
||||
* @name off
|
||||
* @methodOf Kinetic.Node.prototype
|
||||
* @param {String} typesStr
|
||||
@ -133,17 +134,14 @@ Kinetic.Node.prototype = {
|
||||
var parts = event.split('.');
|
||||
var baseEvent = parts[0];
|
||||
|
||||
if(this.eventListeners[baseEvent] && parts.length > 1) {
|
||||
var name = parts[1];
|
||||
|
||||
for(var i = 0; i < this.eventListeners[baseEvent].length; i++) {
|
||||
if(this.eventListeners[baseEvent][i].name === name) {
|
||||
this.eventListeners[baseEvent].splice(i, 1);
|
||||
if(this.eventListeners[baseEvent].length === 0) {
|
||||
delete this.eventListeners[baseEvent];
|
||||
break;
|
||||
}
|
||||
i--;
|
||||
if(parts.length > 1) {
|
||||
if (baseEvent){
|
||||
if (this.eventListeners[baseEvent]) {
|
||||
this._off(baseEvent, parts[1]);
|
||||
}
|
||||
} else {
|
||||
for(var type in this.eventListeners) {
|
||||
this._off(type, parts[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -812,6 +810,18 @@ Kinetic.Node.prototype = {
|
||||
this.setAttr('scale', pos);
|
||||
|
||||
},
|
||||
_off: function(type, name) {
|
||||
for(var i = 0; i < this.eventListeners[type].length; i++) {
|
||||
if(this.eventListeners[type][i].name === name) {
|
||||
this.eventListeners[type].splice(i, 1);
|
||||
if(this.eventListeners[type].length === 0) {
|
||||
delete this.eventListeners[type];
|
||||
break;
|
||||
}
|
||||
i--;
|
||||
}
|
||||
}
|
||||
},
|
||||
_clearTransform: function() {
|
||||
var trans = {
|
||||
x: this.attrs.x,
|
||||
|
@ -665,11 +665,11 @@ Test.prototype.tests = {
|
||||
test(stage.names['myRect'][0].getName() === 'myRect', 'rect name not in names hash');
|
||||
|
||||
circle.setId('newCircleId');
|
||||
test(stage.ids['newCircleId'].getId() === 'newCircleId', 'circle not in ids hash');
|
||||
test(stage.ids['newCircleId'] !== undefined, 'circle not in ids hash');
|
||||
test(stage.ids['myCircle'] === undefined, 'old circle id key is still in ids hash');
|
||||
|
||||
rect.setName('newRectName');
|
||||
test(stage.names['newRectName'][0].getName() === 'newRectName', 'new rect name not in names hash');
|
||||
test(stage.names['newRectName'][0] !== undefined, 'new rect name not in names hash');
|
||||
test(stage.names['myRect'] === undefined, 'old rect name is still in names hash');
|
||||
},
|
||||
'STAGE - set shape and layer opacity to 0.5': function(containerId) {
|
||||
@ -3955,6 +3955,25 @@ Test.prototype.tests = {
|
||||
circle.off('click.bar');
|
||||
test(circle.eventListeners['click'] === undefined, 'circle should have no click listeners');
|
||||
|
||||
/*
|
||||
* test remove all events in name space
|
||||
*/
|
||||
circle.on('click.foo', function() { });
|
||||
circle.on('click.foo', function() { });
|
||||
circle.on('touch.foo', function() { });
|
||||
circle.on('click.bar', function() { });
|
||||
circle.on('touch.bar', function() { });
|
||||
|
||||
test(circle.eventListeners['click'].length === 3, 'circle should have 3 click listeners');
|
||||
test(circle.eventListeners['touch'].length === 2, 'circle should have 2 touch listeners');
|
||||
circle.off('.foo');
|
||||
test(circle.eventListeners['click'].length === 1, 'circle should have 1 click listener');
|
||||
test(circle.eventListeners['touch'].length === 1, 'circle should have 2 touch listeners');
|
||||
|
||||
circle.off('.bar');
|
||||
test(circle.eventListeners['click'] === undefined, 'circle should have no click listeners');
|
||||
test(circle.eventListeners['touch'] === undefined, 'circle should have no touch listeners');
|
||||
|
||||
stage.add(layer);
|
||||
layer.add(circle);
|
||||
layer.draw();
|
||||
|
Loading…
Reference in New Issue
Block a user