
本文介绍如何避免 `window.onload` 单点失败导致后续嵌入中断的问题,推荐使用 `addeventlistener(‘load’, …, {once: true})` 替代直接赋值,并通过 `try/catch` 或独立监听器实现故障隔离与健壮初始化。
在嵌入多个 GeoGebra 小程序(applet)的网页中,依赖单一 window.onload = function() { … } 初始化所有实例存在明显缺陷:一旦某次 applet.inject() 调用因资源未就绪、ID 不存在或脚本加载异常而抛出错误,其后所有注入操作将被跳过,造成部分交互功能完全缺失。
✅ 推荐方案一:为每个 applet 注册独立的 load 监听器(最解耦、最容错)
利用 window.addEventListener(‘load’, handler, {once: true}) 可安全注册多个互不干扰的加载回调。每个监听器独立执行,一个失败不会影响其余:
✅ 优势:逻辑隔离清晰、调试定位精准、便于按需延迟或条件注册。
⚠️ 注意:确保 applet_X 全局变量在监听器执行时已定义(通常 GeoGebra 嵌入脚本会提前声明)。
✅ 推荐方案二:单监听器 + 批量注入 + 统一错误处理(更简洁、易维护)
若偏好集中管理,可将所有注入任务封装为数组,配合 foreach 与 try/catch 实现原子级容错:
✅ 优势:代码紧凑、错误日志统一、便于扩展(如添加重试逻辑、性能统计)。
? 提示:使用解构赋值 ([applet, selector]) 是现代 javaScript 的标准写法,兼容所有主流浏览器(chrome 49+/firefox 46+/edge 16+)。
⚠️ 关键注意事项
- 不要混用 window.onload = … 和 addEventListener:前者会覆盖后者(反之亦然),应全程统一使用 addEventListener。
- 确保 dom 就绪性:load 事件保证所有资源(含图片、iframe、外部 js)加载完成,但 GeoGebra Applet 本身可能依赖异步初始化。若遇到 inject() 报 “element not found”,请确认对应