emscripten window.onload 等效

Posted

技术标签:

【中文标题】emscripten window.onload 等效【英文标题】:emscripten window.onload equivalent 【发布时间】:2016-09-15 04:36:10 【问题描述】:

我有一个 html 文件,我将 emscripten 生成的代码复制粘贴到它的 <script></script> 区域中 浏览器在处理完所有 html 文件之前运行 emscripten 代码 因此,如果 emscripten 代码使用位于 <script></script> 区域之后的 html 元素,它将不起作用here 它表示在页面完全加载后调用 C main() 函数,但这是错误的 html文件完全加载后如何让C代码运行?

【问题讨论】:

【参考方案1】:

此page 是使用 Emscripten 编译为 javascript 并将该 JavaScript 包含在您自己的页面中的教程式指南。它包括在单击 HTML 文档上的按钮之前不运行 C 程序。

简而言之,通常不是复制和粘贴 Emscripten 生成的代码,而是在单独的请求中加载 Emscripten JavaScript 更容易,例如,通过运行 JavaScript 在主文档中:

      var script = document.createElement('script');
      script.src = "my_emscripten_script.js";
      document.body.appendChild(script);

在 Emscripten 中,你根本不需要 main 函数,如果你通过传递命令行标志导出它,我链接到的那个教程将 main 函数重命名为 mainf

      -s EXPORTED_FUNCTIONS='["_mainf"]'

在编译时到emcc(注意前导下划线!),然后当你想启动你的C程序时,你可以从JavaScript调用它。 here 描述了如何从 JavaScript 调用导出函数,但重命名的 mainf 函数将是这样的 JavaScript 调用:

Module.ccall('mainf', null, null);

如果你想确保在 Emscripten 运行时准备好之前不会调用它,Emscripten 使用的 Module 对象可以添加一个 onRuntimeInitialized 方法。这个函数在 Emscripten 准备就绪时被调用,所以你可以使用它来调用ccall 来启动程序。

说了这么多,我很惊讶您的main 函数在文档准备好之前就已经运行了。请注意,html5.h 中的一些 emscripten 函数(例如请求画布全屏显示的函数)仅在用户启动事件时起作用(出于安全原因),因此这可能是您的问题,而不是比在页面加载期间调用 main 的时间点。

【讨论】:

以上是关于emscripten window.onload 等效的主要内容,如果未能解决你的问题,请参考以下文章

window.onload 与 document.onload

js的 window.load 和window.onload 有啥区别

window.onload和$的区别介绍

js window.onload 加载多个函数和追加函数详解

window.onload 添加多个函数绑定

在html中使用window.onload和onload的区别