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

Emscripten示例中Module.requestFullscreen不是函数的问题分析

Emscripten示例Fullscreen按钮报错的解决方法

问题场景

使用Emscripten编译生成WebAssembly项目时,自动生成的示例HTML页面中,"Fullscreen"按钮的点击事件绑定了如下代码:

<span><input type="button" value="Fullscreen" onclick="Module.requestFullscreen(document.getElementById('pointerLock').checked, 
                                                                                document.getElementById('resize').checked)">
      </span>

同时页面中声明的Module对象包含canvas、print、setStatus等成员(代码如下),但并未定义requestFullscreen方法:

var Module = {
        print: (function() {
          var element = document.getElementById('output');
          if (element) element.value = ''; // clear browser cache
          return (...args) => {
            var text = args.join(' ');
            console.log(text);
            if (element) {
              element.value += text + "\n";
              element.scrollTop = element.scrollHeight; // focus on bottom
            }
          };
        })(),
        canvas: (() => {
          var canvas = document.getElementById('canvas');

          // WebGL上下文丢失时的默认提示
          canvas.addEventListener("webglcontextlost", (e) => { alert('WebGL context lost. You will need to reload the page.'); e.preventDefault(); }, false);

          return canvas;
        })(),
        setStatus: (text) => {
          if (!Module.setStatus.last) Module.setStatus.last = { time: Date.now(), text: '' };
          if (text === Module.setStatus.last.text) return;
          var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/);
          var now = Date.now();
          if (m && now - Module.setStatus.last.time < 30) return; // 短时间内跳过重复进度更新
          Module.setStatus.last.time = now;
          Module.setStatus.last.text = text;
          if (m) {
            text = m[1];
            progressElement.value = parseInt(m[2])*100;
            progressElement.max = parseInt(m[4])*100;
            progressElement.hidden = false;
            spinnerElement.hidden = false;
          } else {
            progressElement.value = null;
            progressElement.max = null;
            progressElement.hidden = true;
            if (!text) spinnerElement.style.display = 'none';
          }
          statusElement.innerHTML = text;
        },
        totalDependencies: 0,
        monitorRunDependencies: (left) => {
          this.totalDependencies = Math.max(this.totalDependencies, left);
          Module.setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
        }
      };

点击按钮时会抛出错误:

Uncaught TypeError: Module.requestFullscreen is not a function

解决方法

错误根源是调用方式错误:requestFullscreen是HTML Canvas元素的原生API方法,并非Module对象的成员方法。示例中Module.canvas已指向页面中的canvas元素,因此基础的全屏功能可以直接修改调用方式:

<span><input type="button" value="Fullscreen" onclick="Module.canvas.requestFullscreen()">
      </span>

如果需要实现原按钮代码中提到的指针锁定和全屏resize逻辑,需要自行封装处理函数,示例代码如下:

function handleFullscreen(enablePointerLock, resizeOnFullscreen) {
  const canvas = Module.canvas;
  if (!canvas.requestFullscreen) {
    console.error('当前浏览器不支持全屏API');
    return;
  }

  canvas.requestFullscreen().then(() => {
    // 处理指针锁定
    if (enablePointerLock && canvas.requestPointerLock) {
      canvas.requestPointerLock();
    }

    // 处理全屏resize
    if (resizeOnFullscreen) {
      // 适配窗口尺寸
      canvas.width = window.innerWidth;
      canvas.height = window.innerHeight;
      // 如果使用WebGL,同步调整视口
      const gl = canvas.getContext('webgl');
      if (gl) {
        gl.viewport(0, 0, canvas.width, canvas.height);
      }
    }
  }).catch(err => {
    console.error('全屏切换失败:', err);
  });
}

之后修改按钮的点击事件绑定:

<span><input type="button" value="Fullscreen" onclick="handleFullscreen(document.getElementById('pointerLock').checked, 
                                                                                document.getElementById('resize').checked)">
      </span>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:54:53