基于工作原因,看过很多课件提供商制作的符合SCORM1.2规范的课件,都直接引用了ADL官方RTE中提供的两个API封装函数库APIWrapper.js和SCOFunctions.js,对于SCOFunctions.js中提供cmi.core.session_time的计时方法,有很大的问题。
首先,声明startDate变量用来保存SCO载入时的时间点,然后在loadPage函数中对该变量进行初始化。
其次,在doBack、doContinue、doQuit中均调用了computeTime方法,该方法用系统当前时间减去startDate变量保存的载入时间来计算学员在该SCO上的学习时间。
从逻辑上来看没什么问题,用结束时间减去开始时间不就是持续时间吗。但这里有个缺陷,因为js脚本是在学员的浏览器中运行的,所以取得的所有时间值均是学员计算机的本地时间,并不是LMS服务器时间,所以学员完全可以在退出SCO前,篡改本地计算机时间而使持续时间变长,想改多少改多少。如果LMS以学员学习时长作为考核标准之一的话,学员可以利用这一缺陷轻松拿到学时。
建议自行计算学习时长并正确设置cmi.core.session_time的值,可采用如下方法:
1、修改computeTime方法,注释掉doLMSSetValue( "cmi.core.session_time", formattedTime );这一行。
2、在课件中增加自己的js代码如下所示
var session_time = 0;
function windowUnload() {
// 设置cmi.core.session_time的值,利用convertTotalSeconds方法来格式化时间值
doLMSSetValue("cmi.core.session_time", convertTotalSeconds(session_time));
// do other
// 卸载SCO
unloadPage();
}
function timer() {
// 检测SCO播放状态
if (SCO.getStatus() == "PLAYING")
session_time++;
}
window.onunload = windowUnload;
window.setInterval("timer()", 1000);
3、以上代码利用定时器每秒检测一次SCO的播放状态,在SCO播放时累计秒数,既能防止学员篡改本地计算机时间来影响计时,也可以在SCO暂停时不记录时长,避免学员挂机攒时长。
当然,以上代码仅针对功利性学习行为而提供的带有典型中国特色的在线课程防挂机机制。