button能否在脚本中模拟点击事件

creator中Button能否在脚本中实现点击事件的模拟,有没有类似node.click()之类的方法,在指定的时机触发某Button的click方法?

CCButton.js中定义了按钮点击结束时相应的处理函数:

    _onTouchEnded: function (event) {
        if (!this.interactable || !this.enabledInHierarchy) return;

        if (this._pressed) {
            cc.Component.EventHandler.emitEvents(this.clickEvents, event);
            this.node.emit('click', this);
        }
        this._pressed = false;
        this._updateState();
        event.stopPropagation();
    },

由此可见,按钮点击事件是存放在this.clickEvents数组里面的。
再来观看clickEvents的结构:

        /**
         * !#en If Button is clicked, it will trigger event's handler
         * !#zh 按钮的点击事件列表。
         * @property {Component.EventHandler[]} clickEvents
         */
        clickEvents: {
            default: [],
            type: cc.Component.EventHandler,
            tooltip: CC_DEV && 'i18n:COMPONENT.button.click_events',
        }

可以发现,CCButton的clickEvents储存的是cc.Component.EventHandler的变量,关于cc.Component.EventHandler的说明见api说明

所以,通过代码为button添加一个处理函数的代码如下:

var eventHandler = new cc.Component.EventHandler();
eventHandler.target = newTarget;
eventHandler.component = "MainMenu";
eventHandler.handler = "OnClick";
eventHandler.customEventData = "my data";
this.button.clickEvents.push(eventHandler);

这里,this.button是一个cc.Button类型的对象,当点击该对象对应的按钮时,就会出发newTarget的MainMenu教程的OnClick(my data)函数。

谢谢回复,但是这个是给按钮添加事件,而我要的是在代码里去模拟用户点击了这个按钮。

this.node.emit(‘click’)

1赞
this.button._onTouchEnded();

没有_onTouchEnded 这个api

无法触发

可以用 btn.clickEvents[0].emit() 来模拟触发

1赞

亲测可行

this.node.getComponent(cc.Button).clickEvents[0].emit([‘click’]);

参考:http://www.john3.cn/2018/11/12/diary/d20181112/

2赞