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

如何用react-scorm-provider在React中集成SCORM包及解决API连接问题

SCORM集成React应用的API连接问题排查与解决

问题概述

尝试使用react-scorm-provider库将SCORM包集成到React应用中,目标是在iframe内展示SCORM包并获取学员姓名、学习状态、跟踪信息等SCORM数据,但目前无法与SCORM API建立连接。

当前代码结构

父组件(App.js)

import React from "react";
import "./styles.css";
import ScormProvider from "react-scorm-provider";
import Scorm from "components/Scorm";

export default function App() {
  return (
    <ScormProvider version="1.2" debug={true}>
      <div className="App">
        <h1>Quiz</h1>
        <hr />
        <Scorm />
      </div>
    </ScormProvider>
  );
}

子组件(Scorm.jsx)

import React from "react";
import { withScorm } from "react-scorm-provider";

const Scorm = (props) => {
    return (
      <div>
        <iframe
          src="https://louuu03.github.io/Scorm_Example/story.html"
          height="600px"
          width="900px"
          title="Scorm Package URL"
        />
        <br />
        <button onClick={() => { console.log(props); }}>
          Click Me
        </button>
      </div>
    );
}

export default withScorm()(Scorm);

控制台报错

控制台报错截图

问题原因与解决办法

1. 跨域限制导致API无法访问

你加载的SCORM包来自外部域名,浏览器同源策略会阻止React应用与iframe内的SCORM包进行API通信。SCORM API需要同源环境才能正常交互,或通过postMessage配合适配器实现跨域数据传递。

解决方式:

  • 将SCORM包部署到与React应用相同的域名下,消除跨域限制;
  • 若必须跨域,需修改SCORM包代码添加postMessage通信逻辑,同时在React应用中监听消息并转发到react-scorm-provider的API接口。

2. react-scorm-provider无法自动跨iframe查找API

该库默认在当前窗口或父窗口查找SCORM API,但iframe内的SCORM包会将API挂载到自身window对象,库无法自动跨iframe获取。需手动获取并注入API:

修改后的子组件代码:

import React, { useEffect, useRef } from "react";
import { withScorm } from "react-scorm-provider";

const Scorm = (props) => {
    const iframeRef = useRef(null);

    useEffect(() => {
        const iframe = iframeRef.current;
        if (iframe) {
            iframe.onload = () => {
                // 获取iframe内的SCORM API
                const scormApi = iframe.contentWindow.API || iframe.contentWindow.GetAPI?.();
                if (scormApi) {
                    // 将API注入到react-scorm-provider上下文
                    props.scorm.setApi(scormApi);
                }
            };
        }
    }, [props.scorm]);

    return (
      <div>
        <iframe
          ref={iframeRef}
          src="https://louuu03.github.io/Scorm_Example/story.html"
          height="600px"
          width="900px"
          title="Scorm Package URL"
          allow="same-origin"
        />
        <br />
        <button onClick={() => {
            // 尝试获取SCORM数据
            props.scorm.getLearnerName().then(name => console.log("学员姓名:", name));
            props.scorm.getCompletionStatus().then(status => console.log("学习状态:", status));
        }}>
          获取SCORM数据
        </button>
      </div>
    );
}

export default withScorm()(Scorm);

3. SCORM包未正确暴露API

部分SCORM包仅在LMS环境下初始化API,未在普通浏览器环境暴露。需检查SCORM包内的story.html,确保API已挂载到window对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:40:55