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

在Phaser中使用DOM选择器时无法访问this.gameState的解决方法

解决DOM事件中无法访问PhaserJS gameState的问题

问题核心是普通事件回调函数的this指向偏差:当用普通函数作为addEventListener的回调时,触发事件后this会自动指向触发事件的DOM元素(也就是你的#grassBtn按钮),而非你期望的包含gameState的上下文,所以this.gameState自然无法访问。

下面是三种可行的解决方法:

  • 使用箭头函数
    箭头函数不会绑定自身的this,会继承外层作用域的this,直接就能访问到gameState:

    document.querySelector("#grassBtn").addEventListener("click", () => {
        this.gameState.selectedBlock = 1;
        console.log(this.gameState.selectedBlock);
    });
    
  • 提前保存外层上下文
    在添加事件监听前,把外层的this存到变量里,回调函数里用这个变量访问gameState:

    const ctx = this;
    document.querySelector("#grassBtn").addEventListener("click", function () {
        ctx.gameState.selectedBlock = 1;
        console.log(ctx.gameState.selectedBlock);
    });
    
  • 用bind绑定this
    把回调函数的this手动绑定到外层上下文:

    function setGrassBlock() {
        this.gameState.selectedBlock = 1;
        console.log(this.gameState.selectedBlock);
    }
    document.querySelector("#grassBtn").addEventListener("click", setGrassBlock.bind(this));
    

注意:你之前在addEventListener里传的第三个参数this,在现代浏览器中是用来控制事件的捕获/冒泡阶段的,并非用来绑定回调函数的this,所以这个写法无法解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:03:10