Button:关于按钮监听的Bug ________@开发团队

UI制作
按钮3(父节点)下加 一组按钮【按钮1、按钮2】
按钮 1、2、3分别各自添加响应事件
脚本功能
点击按钮3:按钮1、2的父节点激活,同时会添加按钮1、2的监听On函数,并将按钮2动态隐藏掉
期望结果:点击按钮1只响应1的事件,点击按钮2无响应
Bug详述
Bug1:点击子按钮1 或者2,父按钮3也会响应
Bug2:子按钮2已经隐藏掉而监听没有关闭。(添加监听与隐藏按钮同时进行冲突?__这里是问号!是说bug?)

—————看这里!!!!———关键说明!关键说明!关键说明!————重点是Bug2!—————
————————————————————————————————————————————————
因为子按钮1、2的监听是在子按钮组节点脚本的onload里添加的,关于按钮1、2如下图


动态激活子按钮组的节点的时候(初始化隐藏的!)也隐藏了子按钮2,是这里出了问题,不知道节点激活是不是跟Tiled地图加载类似效率不是很好。(因为如果延迟1S隐藏按钮2就不会出现问题),_按钮3_脚本如下:

——————————————————————————————————————————————
——————————————————————————————————————————————
(附上Demo)DemoPro.zip (2.7 MB)

请更新到最新的1.1.1版本再试试

你是怎么隐藏的?如果用active = false的话应该是不会出现这种情况的

请试试最新的 1.1.1 RC2,这个问题应该已经修复了。

是这样隐藏的

我重新编辑了一下主题的说明,重点是想说Bug2

在用的版本是最新的版本CocosCreator_v1.1.1_2016061202_Setup,
不知道跟你说的版本(1.1.1RC2)是不是同一个版本:unamused:

你描述的不是很清楚啊,你的demo我也看了,也不知道你想表达什么,可不可以描述的详细一点呢?

比如

父节点激活的同时,父节点之前没有激活吗?还有打开这两个按钮的监听,按钮需要打开监听吗?不是实例出来就监听吗?

你这里脚本添加监听,是在哪个脚本添加监听?脚本又是在哪个组件上,还有啥添加click events又是什么?,你这里的target又代表什么?

这句我能理解,就是子按钮的点击事件传递到父节点了,1.1.1版本的creator是在button的触摸回调(包括点击回调)里阻止了事件的传递

这里同样,按钮要需要什么操作来打开监听?

这句话更不能理解了,打开与隐藏同时进行冲突?

你这里同一个方法是指哪个方法?这个方法有什么作用?这个方法在哪里?

这里同样,打开监听倒是是个什么操作?

原谅我理解能力有问题,但是我看了你的描述,看了你的demo,就看懂了你说子节点的触摸事件会传递到父节点,其他一样都没有看懂,也不知道你想做什么,所以不知道怎么帮你:joy:

不好意思

1.1.1正式版在这里

http://www.cocos.com/download/creator/

最好是尽量描述你现在的操作,和你想达到的目的,有图文说明最好

重新编辑了我的问题,感觉开发团队也没注意到我说的第二个问题:joy:

以下是个人看法,不保证其正确性,请以官方大神的答案为准

刚刚看了你的项目,关于bug2,出现的原因是因为你的代码是先执行了button_2.active = false,然后再执行的button_2.on(而不是你期望的先执行onload里的node.on添加回调,然后再执行node.active = false),但是node的实现里,on函数里面添加事件并没有判断当前node的active状态,导致了node在active = false的情况下还能用on添加事件

至于点击button2响应后,button3也会响应是因为touch回调没有阻止事件冒泡,button2的事件会一直往上层派送(先是button2的父节点,然后是button2的父节点的父节点,一直派送,直到某个节点阻止了事件冒泡,或者派送到根节点)如果在touch回调里调用的话,button3就不会响应

至于bug1,我这边用你的项目没有发现这个问题,但是应该也是没有阻止事件冒泡,事件会继续往父节点派送

所以这个问题要问一下 @zilong 大神,看是楼主的操作有误,还是node.on函数里添加事件之前先判断node的active状态

关于Bug2,你的看法是错误的,你可以自己写个脚本测试下
关于bug1,button3并没有动态添加监听函数,使用的是button组件携带的click events功能

(ps:鄙人对cocos还不是很熟)
所以说引擎内部是怎么处理的我们不知道只想反应下,请引擎开发的大神修补Bug。
:triumph:
还想补充一下:监听函数里面是不可以加当前按钮是否激活的判断的,
原因:
1:按钮被隐藏的时候,是执行不到ON函数里面的;
2:如果按钮a和按钮b需要 位置 重合,那将导致有一个按钮永远无法响应(即使上层的按钮被隐藏);

bug2我已经测试了,如果先执行node.on添加监听,再执行node.active = false,bug2就不会发生,还有bug1,我的意思是你在button_1上添加了监听,但是没有在回调里阻止事件冒泡,所以事件会往父节点一层一层派送(父节点–父节点的父节点–父节点的父节点的父节点)派送,button_3是button_1的父节点的父节点,所以会接收到触摸事件

我再测试一下你的项目,确认一下bug2

有可能我关于bug2的看法是错误的,我在onLoad和stop_ButtonOn函数里打log,的确是onLoad先执行,然后再执行的stop_ButtonOn

这里的确是按照你期望的顺序执行的,但是我怀疑在引擎内部是先执行node.active = false的相关操作,再执行的node.on,当然这个我也不知道怎么证实:joy:

但是我这边测试出和你BUG2同样的情况,我这边测试过程是这样的

我把添加事件和隐藏按钮做成两个函数

如果我先执行stop_ButtonOn,再执行addTouchEvent,也就是先隐藏,再添加事件,就会出现你说的情况,button_2的监听还在,button_3也会接收此次事件,

如果我在button_2的触摸回调里加上event.stopPropagation(); button_2的点击事件button_2还是会响应,但是button_3就不会响应了

如果我先执行addTouchEvent,再执行stop_ButtonOn,也就是先添加事件,再隐藏,就没有任何问题

这个你可以自己试试,也许我的看法的确是错误的,这个只有问问官方的大神,他们肯定清楚

这个你可以自己试试,我这边让active = false之后是还能添加事件并执行回调的

理论上来说任何时候都是可以判断某个节点的激活状态的,关键是获取到那个节点,只要获取到了,不管在哪里都可以知道他的属性的

这句话我没有理解是什么意思

如果楼上的动态图看不清楚,可以另存为到本地,或者在浏览器的新标签页打开

大哥,话要连着看,拆分来看是有歧义的,这个问题就这样了,反正我也弃用了

大哥,请问我哪里理解出歧义了呢?还有如果我有哪里说的不对的?还请指出,谢谢,不然以后会一直错下去:grin:

这个问题我要顶起来,1.5.0b2、b3,在android真机上有这个问题。web没有。(其实从1.4就有,只是一直没去查原因,现在换1.5了)

我这里表现是上层A面板有个按钮A1,下层B面板有个按钮B2,位置重合。

A面板关掉了,还可以点A1,下面的B2永远没法点…

更蛋疼的是,A面板打开时,A1就算被active=false还是可以点到。
不想去看设置active和on(‘touched’)的顺序了,麻烦有人确认这个bug吗,全乱套了。

你说的这个情况多半是你自己的代码引起的,能否弄个 demo 上传上来,我帮你看一下。