监听和发射事件@H_403_4@
监听事件
事件处理是在节点(cc.Node
)中完成的。对于组件,可以通过访问节点this.node
来注册和监听事件。监听事件可以 通过this.node.on()
函数来注册,方法如下:
cc.Class({
extends: cc.Component,properties: {
},onLoad: function@H_403_4@ (@H_403_4@) @H_403_4@{
this@H_403_4@.node.on('mousedown'@H_403_4@,function@H_403_4@ ( event @H_403_4@) @H_403_4@{
console@H_403_4@.log('Hello!'@H_403_4@);
});
},});
值得一提的是,事件监听函数on
可以传第三个参数 target,用于绑定响应函数的调用者。以下两种调用方式, 效果上是相同的:
// 使用函数绑定@H_403_4@
this@H_403_4@.node.on(function@H_403_4@ ( event @H_403_4@) @H_403_4@{
this@H_403_4@.enabled = false@H_403_4@;
}.bind(this@H_403_4@));
// 使用第三个参数@H_403_4@
this@H_403_4@.node.on(function@H_403_4@ (event@H_403_4@) @H_403_4@{
this@H_403_4@.enabled = false@H_403_4@;
},this@H_403_4@);
除了使用on
监听,我们还可以使用once
方法。once
监听在监听函数响应后就会关闭监听事件。
关闭监听
当我们不再关心某个事件时,我们可以使用off
方法关闭对应的监听事件。需要注意的是,off
方法的 参数必须和on
方法的参数一一对应,才能完成关闭。
我们推荐的书写方法如下:
function@H_403_4@ (@H_403_4@) @H_403_4@{
'Hello World'@H_403_4@);
},onEnable: function@H_403_4@ (@H_403_4@) @H_403_4@{
this@H_403_4@.node.on('foobar'@H_403_4@,this@H_403_4@._sayHello,this@H_403_4@);
},onDisable: function@H_403_4@ (@H_403_4@) @H_403_4@{
this@H_403_4@.node.off( 发射事件
我们可以通过两种方式发射事件:emit
和dispatchEvent
。两者的区别在于,后者可以做事件传递。 我们先通过一个简单的例子来了解emit
事件:
'say-hello'@H_403_4@,function@H_403_4@ (event@H_403_4@) @H_403_4@{
console@H_403_4@.log(event.detail.msg);
});
},start: function@H_403_4@ (@H_403_4@) @H_403_4@{
this@H_403_4@.node.emit('Hello,this is Cocos Creator'@H_403_4@,});
},});
派送事件
上文提到了dispatchEvent
方法,通过该方法发射的事件,会进入事件派送阶段。在 Cocos Creator 的事件派送系统中,我们采用冒泡派送的方式。冒泡派送会将事件从事件发起节点,不断地向上传递给他的父级节点,直到到达根节点或者在某个节点的响应函数中做了中断处理event.stopPropagation()
。
如上图所示,当我们从节点 c 发送事件 “foobar”,倘若节点 a,b 均做了 “foobar” 事件的监听,则 事件会经由 c 依次传递给 b,a 节点。如:
// 节点 c 的组件脚本中@H_403_4@
this@H_403_4@.node.dispatchEvent( new@H_403_4@ cc.Event.EventCustom(true@H_403_4@) );
如果我们希望在 b 节点截获事件后就不再将事件传递,我们可以通过调用event.stopPropagation()
函数来完成。具体方法如下:
// 节点 b 的组件脚本中@H_403_4@
this@H_403_4@.node.on(function@H_403_4@ (event@H_403_4@) @H_403_4@{
event.stopPropagation();
});
请注意,在发送用户自定义事件的时候,请不要直接创建cc.Event
对象,因为它是一个抽象类,请创建cc.Event.EventCustom
对象来进行派发。
事件对象
在事件监听回调中,开发者会接收到一个cc.Event
类型的事件对象event
,stopPropagation
就是cc.Event
的标准 API,其它重要的 API 包含:
API 名
类型
意义
type
String
事件的类型(事件名)
target
cc.Node
接收到事件的原始对象
currentTarget
接收到事件的当前对象,事件在冒泡阶段当前对象可能与原始对象不同
getType
Funciton
获取事件的类型
stopPropagation
Function
停止冒泡阶段,事件将不会继续向父节点传递,当前节点的剩余监听器仍然会接收到事件
stopPropagationImmediate
立即停止事件的传递,事件将不会传给父节点以及当前节点的剩余监听器
getCurrentTarget
获取当前接收到事件的目标节点
detail
自定义事件的信息(属于cc.Event.EventCustom
)
setUserData
设置自定义事件的信息(属于getUserData
获取自定义事件的信息(属于cc.Event.EventCustom
)
完整的 API 列表可以参考cc.Event
及其子类的 API 文档。
系统内置事件
以上是通用的事件监听和发射规则,在 Cocos Creator 中为cc.Node
内置了鼠标、触摸等系统事件,可参考系统内置事件文档。