(function () {
var NewEventCustom = {
eventTarget: new cc.EventTarget()
};
//new cc.EventTarget();
NewEventCustom.on = function (event_name, call_back, nodeOrProity) {
if (typeof event_name === 'undefined' || typeof call_back === 'undefined') {
cc.warn('EventCustom on: event_name or callback is null.');
return;
};
if (!nodeOrProity) {
nodeOrProity = cc.game;
}
if (nodeOrProity instanceof cc.Component) {
nodeOrProity = nodeOrProity.node;
}
function onEnd(event) {
call_back(event.detail, event);
}
if (nodeOrProity instanceof cc.Node) {
this.off(event_name, nodeOrProity);
nodeOrProity._eventCustom = nodeOrProity._eventCustom || {};
nodeOrProity._eventCustom[event_name] = onEnd;
}
return this.eventTarget.on(event_name, onEnd, nodeOrProity, true);
};
NewEventCustom.once = function (event_name, call_back, nodeOrProity) {
if (typeof event_name === 'undefined' || typeof call_back === 'undefined') {
cc.warn('EventCustom once: event_name or callback is null.');
return;
};
if (nodeOrProity instanceof cc.Component) {
nodeOrProity = nodeOrProity.node;
}
var self = this;
function onceFunc(event) {
call_back(event.detail, event);
};
this.eventTarget.once(event_name, onceFunc, nodeOrProity, true);
};
//发送自定义事件
//@param {string} event_name
//@param {*} user_data
NewEventCustom.emit = function (event_name, user_data) {
if (typeof event_name === 'undefined') {
cc.warn('EventCustom emit: event_name is null.');
return;
};
cc.log("EventCustom.emit " + event_name);
var event = new cc.Event.EventCustom(event_name);
event.detail = user_data;
// Event.AT_TARGET
event.eventPhase = cc.Event.AT_TARGET;
event.target = event.currentTarget = this.eventTarget;
this.eventTarget.dispatchEvent(event);
};
//关闭自定义事件
//@param {listener|string|Node|Component} eventNameOrNode
//@param {null|node|Component} nodeOrComponent if eventNameOrNode is "string" need nodeOrComponent
NewEventCustom.off = function (eventNameOrNode, nodeOrComponent) {
if (eventNameOrNode instanceof cc.EventListener) {
cc.eventManager.removeListener(eventNameOrNode);
} else if (typeof eventNameOrNode === 'string') {
if (nodeOrComponent) {
//关闭某个节点上这个事件的监听
if (nodeOrComponent instanceof cc.Component) {
nodeOrComponent = nodeOrComponent.node;
}
if (nodeOrComponent._eventCustom) {
var callback = nodeOrComponent._eventCustom[eventNameOrNode];
if (callback) {
delete nodeOrComponent._eventCustom[eventNameOrNode];
this.eventTarget.off(eventNameOrNode, callback, nodeOrComponent, true);
}
} else {
this.eventTarget.off(eventNameOrNode);
}
}
} else if (eventNameOrNode instanceof cc.Node) {
this.eventTarget.targetOff(eventNameOrNode);
} else if (eventNameOrNode instanceof cc.Component) {
cc.eventManager.targetOff(eventNameOrNode.node);
}
};
module.exports = NewEventCustom;
})();
以上为我自定义事件脚本,
然后在项目中多处(不同节点,不同脚本)做事件监听,例如:
EventCustom.on(“event_name”, function () {
this.myFunc();
}.bind(this), this.node);
某个条件下触发一次事件发送
EventCustom.emit(“event_name”);
运行结果:
只有一处监听生效,且执行了两次this.myFunc();
所以想问下,这个自定义事件官方能不能给个详细的案例,或者这个是个bug.

