You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为NameInput窗口设置20秒超时自动触发OK按钮?技术求助

解决NameInput窗口自动触发OK按钮的报错问题

嘿,我帮你梳理下这个问题,你遇到的uncaught type error this.callokhandler is not a function错误和功能未达预期,主要是两个核心问题导致的,咱们一步步来解决:

错误根源解析

  1. this指向跑偏了:在setTimeout的普通函数回调里,this默认指向的是全局对象(浏览器里就是window),而不是你的Window_NameInput实例,所以哪怕方法名写对了(注意是callOkHandler,大小写别错),也找不到这个方法。
  2. 重复创建定时器:processHandling是窗口每帧都会执行的方法,你现在的代码会在窗口打开的每一瞬间都创建一个20秒的定时器,最终20秒后会一堆定时器同时触发,完全不符合预期。

正确的实现代码

咱们直接复用你原有的processOk()逻辑(因为原代码里已经写好了OK按钮的处理,比调用callOkHandler更稳妥),同时解决上面两个问题:

Window_NameInput.prototype.processHandling = function() {
    if (this.isOpen() && this.active) {
        // 只在没创建过定时器的时候初始化,避免重复
        if (!this._autoOkTimer) {
            // 用箭头函数绑定this,确保回调里的this是当前窗口实例
            this._autoOkTimer = setTimeout(() => {
                this.processOk(); // 执行原有的OK处理逻辑
                this._autoOkTimer = null; // 重置标记,方便窗口重新打开时再次触发
            }, 20000); // 注意是20000毫秒=20秒,你之前写的2000是2秒哦
        }

        // 保留手动触发OK的功能(可选,如果你想让用户还能手动按OK)
        if (Input.isRepeated('ok')) {
            this.processOk();
            clearTimeout(this._autoOkTimer); // 手动触发后清除自动定时器
            this._autoOkTimer = null;
        }
    } else {
        // 窗口关闭或失活时,清除定时器避免误触发
        clearTimeout(this._autoOkTimer);
        this._autoOkTimer = null;
    }
};

关键细节说明

  • _autoOkTimer标记:用来记录是否已经创建了自动触发的定时器,确保整个窗口生命周期里只创建一次。
  • 箭头函数绑定this:箭头函数不会改变this的指向,回调里的this就是当前的Window_NameInput实例,这样就能正确调用processOk()了。
  • 兼容手动操作:如果用户在20秒内手动按了OK,我们会清除自动定时器,避免后续重复触发。
  • 状态清理:窗口关闭或者不再激活时,及时清除定时器,避免内存泄漏和不必要的触发。

这样修改后,窗口打开20秒后就会自动触发OK按钮的逻辑,同时也不会再出现之前的报错啦。

内容的提问来源于stack exchange,提问作者Tosps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:18:57