参考 https://blog.csdn.net/cooldragon/article/details/19006835
https://wenku.baidu.com/view/a0bd5ca5284ac850ad02427b.html
D:\CAMTASIA STUDIO\NOI_EMACS_GDB
│ adlcp_v1p3.xsd
│ imscp_v1p1.xsd
│ imsmanifest.xml
│ NOI_emacs_gdb.html
│ NOI_emacs_gdb.js
│ NOI_emacs_gdb.mp4
│ NOI_emacs_gdb.zip 这是打包了其他所有文件的SCORM包
│ NOI_emacs_gdb_config.xml
│ NOI_emacs_gdb_controller.swf
│ NOI_emacs_gdb_embed.css
│ NOI_emacs_gdb_First_Frame.png
│ NOI_emacs_gdb_player.html
│ playerProductInstall.swf
│ scormwrapper.js
│
├─scripts
│ config_xml.js
│ handlebars.js
│ jquery-1.7.1.min.js
│ jquery-ui-1.8.15.custom.min.js
│ modernizr.js
│ player-min.js
│ swfobject.js
│
└─skins
└─overlay
player-min.css
spritesheet.png
实际生成的主要是一个mp4文件,然后SCORM课件就是打包了一堆HTML、XML、JS的zip包(包含了内容包所有文件)
imsmanifest.xml这个文件是主配置文件,顶级元素
adlcp_v1p3.xsd和imscp_v1p1.xsd这两个xsd,被主配置文件imsmanifest.xml文件引用,从前缀ADL项目(SCORM模型)和IMS项目(内容打包规范)看,是定义了这两个东西里用到的数据类型之类的构件模块
在主配置文件中,存在类似如下的信息:
……
即默认学习内容的组织形式是标识为TOC1的那个,这个组织形式里的项目I_SCO0引用了标识为SCO0的资源。从资源部分可以知道,SCO0资源就是链接到NOI_emacs_gdb.html文件(同时依赖ALLRESOURCES资源),所以,这个html文件就是主入口了。
NOI_emacs_gdb.html文件就是一个普通的网页文件,关键部分是用
NOI_emacs_gdb_player.html文件的一些代码如下:
调用的API来自scormwrapper.js这个API包装文件,该文件定义了apiCall,findAPI,getAPI,getAPIHandle函数,基本原理是getAPIHandle调用getAPI获得句柄,在apiCall内调用LMS平台的功能前,需要先获取此句柄。而getAPI是调用findAPI从各级父窗口搜索得到句柄的。
在moodle中,查看网页源码,可以看到:
后面那个js的末尾,存在以下代码:
M.scorm_api={};
M.scorm_api.init=function(Y,def,cmiobj,cmiint,cmicommentsuser,cmicommentslms,scormdebugging,scormauto,scormid,cfgwwwroot,sesskey,scoid,attempt,viewmode,cmid,currentorg,autocommit){
window.API_1484_11=new SCORMapi1_3(def,cmiobj,cmiint,cmicommentsuser,cmicommentslms,scormdebugging,scormauto,scormid,cfgwwwroot,sesskey,scoid,attempt,viewmode,cmid,currentorg,autocommit)
}
注意到window.API_1484_11这个对象,正是包装文件scormwrapper.js中的函数findAPI中“苦苦”查找的东西:
function findAPI( win )
{
var findAPITries = 0;
var theAPI = null;
// Search each parent window until we find the API, encounter a window with no parent / the
// same as the current window, or have reached our MAX_PARENTS_TO_SEARCH to search threshold
while ( ( win.API_1484_11 == null )
&& ( win.API == null )
&& ( win.parent != null )
&& ( win.parent != win )
&& ( findAPITries <= MAX_PARENTS_TO_SEARCH ) )
{
findAPITries++;
win = win.parent;
}
if ( win.API_1484_11 != null )
{
apiVersion = 1;
theAPI = win.API_1484_11;
}
else if ( win.API != null )
{
apiVersion = 0;
theAPI = win.API;
}
return theAPI;
}