JavaScript 和Moodle 中的 Scorm 1.2
我从 flash 发布 html,即 flash + scorm 1.2 我的 html 包含 .swf 作为播放器 .swf 播放器将有菜单,学生可以从此 swf 导航页面,因此当学生到达最后一页时,课程状态应该已完成,但是我发生了什么? 当第一次学生访问课程并关闭它时 >>课程状态不完整,这是正确的,,,,但是在第二次打开课程时,状态更改为已完成,第三次更改为未完成..第四次更改为完成,,我无法理解到底发生了什么是我使用的javascript函数::
var g_nFindAPITries = 0;
var g_objAPI = null;
var g_bInitDone = false;
var g_bFinishDone = false;
var g_bSCOBrowse = false;
var g_dtmInitialized = new Date(); // will be adjusted after initialize
var g_bMasteryScoreInitialized = false;
function AlertUserOfAPIError(strText) {
if (g_bShowApiErrors) {
var s = strText + "\n\n" + g_strDisableErrorMsgs;
if (!confirm(s)){
g_bShowApiErrors = false
}
}
}
function ExpandString(s){
var re = new RegExp("%","g")
for (i = arguments.length-1; i > 0; i--){
s2 = "%" + i;
if (s.indexOf(s2) > -1){
re.compile(s2,"g")
s = s.replace(re, arguments[i]);
}
}
return s
}
function FindAPI(win) {
while ((win.API == null) && (win.parent != null) && (win.parent != win)) {
g_nFindAPITries ++;
if (g_nFindAPITries > 500) {
AlertUserOfAPIError(g_strAPITooDeep);
return null;
}
win = win.parent;
}
return win.API;
}
function APIOK() {
return ((typeof(g_objAPI)!= "undefined") && (g_objAPI != null))
}
function SCOInitialize() {
var err = true;
if (!g_bInitDone)
{
if ((window.parent) && (window.parent != window)){
g_objAPI = FindAPI(window.parent)
}
if ((g_objAPI == null) && (window.opener != null)) {
g_objAPI = FindAPI(window.opener)
}
if (!APIOK()) {
AlertUserOfAPIError(g_strAPINotFound);
err = false
}
else
{
err = g_objAPI.LMSInitialize("");
if (err == "true")
{
g_bSCOBrowse = (g_objAPI.LMSGetValue("cmi.core.lesson_mode") == "browse");
if (!g_bSCOBrowse)
{
if (g_objAPI.LMSGetValue("cmi.core.lesson_status") == "not attempted")
{
err = g_objAPI.LMSSetValue("cmi.core.lesson_status","incomplete")
}
}
}
else
{
AlertUserOfAPIError(g_strAPIInitFailed)
}
}
if (typeof(SCOInitData) != "undefined")
{
// The SCOInitData function can be defined in another script of the SCO
SCOInitData()
}
g_dtmInitialized = new Date();
}
g_bInitDone = true;
return (err + "") // Force type to string
}
function SCOFinish() {
if ((APIOK()) && (g_bFinishDone == false)) {
SCOReportSessionTime()
if (g_bSetCompletedAutomatically){
SCOSetStatusCompleted();
}
if (typeof(SCOSaveData) != "undefined"){
// The SCOSaveData function can be defined in another script of the SCO
SCOSaveData();
}
g_bFinishDone = (g_objAPI.LMSFinish("") == "true");
}
return (g_bFinishDone + "" ) // Force type to string
}
// Call these catcher functions rather than trying to call the API adapter directly
function SCOGetValue(nam) {return ((APIOK())?g_objAPI.LMSGetValue(nam.toString()):"")}
function SCOCommit() {return ((APIOK())?g_objAPI.LMSCommit(""):"false")}
function SCOGetLastError() {return ((APIOK())?g_objAPI.LMSGetLastError():"-1")}
function SCOGetErrorString(n) {return ((APIOK())?g_objAPI.LMSGetErrorString(n):"No API")}
function SCOGetDiagnostic(p) {return ((APIOK())?g_objAPI.LMSGetDiagnostic(p):"No API")}
//LMSSetValue is implemented with more complex data management logic below
var g_bMinScoreAcquired = false;
var g_bMaxScoreAcquired = false;
// Special logic begins here
function SCOSetValue(nam,val){
var err = "";
if (!APIOK()){
AlertUserOfAPIError(g_strAPISetError + "\n" + nam + "\n" + val);
err = "false"
} else if (nam == "cmi.core.score.raw") err = privReportRawScore(val)
if (err == ""){
err = g_objAPI.LMSSetValue(nam,val.toString() + "");
if (err != "true") return err
}
if (nam == "cmi.core.score.min"){
g_bMinScoreAcquired = true;
g_nSCO_ScoreMin = val
}
else if (nam == "cmi.core.score.max"){
g_bMaxScoreAcquired = true;
g_nSCO_ScoreMax = val
}
return err
}
,这是在body html中,
<body bgcolor="#ffffff" onload="SCOInitialize()" onunload="SCOFinish()" onbeforeunload="SCOFinish()" >
所以为什么它的交换一次又一次不完整和完成,我尝试设置值 cmi.core.lesson_status 但它不起作用
I am publish html from flash which is flash + scorm 1.2
my html contain .swf as player
.swf player will have menu and student navigate pages from this swf, so the status of the course should be completed when the student reach last page,,, but what happened with me?
when 1st time student visit the course and close it >> the status of lesson is incomplete which is correct,,,, but at the 2nd time when open the course the status changed to completed and the third time change to incomplete ..4th time change to complete ,, i cant understand what exactly happened this is the javascript functions i use ::
var g_nFindAPITries = 0;
var g_objAPI = null;
var g_bInitDone = false;
var g_bFinishDone = false;
var g_bSCOBrowse = false;
var g_dtmInitialized = new Date(); // will be adjusted after initialize
var g_bMasteryScoreInitialized = false;
function AlertUserOfAPIError(strText) {
if (g_bShowApiErrors) {
var s = strText + "\n\n" + g_strDisableErrorMsgs;
if (!confirm(s)){
g_bShowApiErrors = false
}
}
}
function ExpandString(s){
var re = new RegExp("%","g")
for (i = arguments.length-1; i > 0; i--){
s2 = "%" + i;
if (s.indexOf(s2) > -1){
re.compile(s2,"g")
s = s.replace(re, arguments[i]);
}
}
return s
}
function FindAPI(win) {
while ((win.API == null) && (win.parent != null) && (win.parent != win)) {
g_nFindAPITries ++;
if (g_nFindAPITries > 500) {
AlertUserOfAPIError(g_strAPITooDeep);
return null;
}
win = win.parent;
}
return win.API;
}
function APIOK() {
return ((typeof(g_objAPI)!= "undefined") && (g_objAPI != null))
}
function SCOInitialize() {
var err = true;
if (!g_bInitDone)
{
if ((window.parent) && (window.parent != window)){
g_objAPI = FindAPI(window.parent)
}
if ((g_objAPI == null) && (window.opener != null)) {
g_objAPI = FindAPI(window.opener)
}
if (!APIOK()) {
AlertUserOfAPIError(g_strAPINotFound);
err = false
}
else
{
err = g_objAPI.LMSInitialize("");
if (err == "true")
{
g_bSCOBrowse = (g_objAPI.LMSGetValue("cmi.core.lesson_mode") == "browse");
if (!g_bSCOBrowse)
{
if (g_objAPI.LMSGetValue("cmi.core.lesson_status") == "not attempted")
{
err = g_objAPI.LMSSetValue("cmi.core.lesson_status","incomplete")
}
}
}
else
{
AlertUserOfAPIError(g_strAPIInitFailed)
}
}
if (typeof(SCOInitData) != "undefined")
{
// The SCOInitData function can be defined in another script of the SCO
SCOInitData()
}
g_dtmInitialized = new Date();
}
g_bInitDone = true;
return (err + "") // Force type to string
}
function SCOFinish() {
if ((APIOK()) && (g_bFinishDone == false)) {
SCOReportSessionTime()
if (g_bSetCompletedAutomatically){
SCOSetStatusCompleted();
}
if (typeof(SCOSaveData) != "undefined"){
// The SCOSaveData function can be defined in another script of the SCO
SCOSaveData();
}
g_bFinishDone = (g_objAPI.LMSFinish("") == "true");
}
return (g_bFinishDone + "" ) // Force type to string
}
// Call these catcher functions rather than trying to call the API adapter directly
function SCOGetValue(nam) {return ((APIOK())?g_objAPI.LMSGetValue(nam.toString()):"")}
function SCOCommit() {return ((APIOK())?g_objAPI.LMSCommit(""):"false")}
function SCOGetLastError() {return ((APIOK())?g_objAPI.LMSGetLastError():"-1")}
function SCOGetErrorString(n) {return ((APIOK())?g_objAPI.LMSGetErrorString(n):"No API")}
function SCOGetDiagnostic(p) {return ((APIOK())?g_objAPI.LMSGetDiagnostic(p):"No API")}
//LMSSetValue is implemented with more complex data management logic below
var g_bMinScoreAcquired = false;
var g_bMaxScoreAcquired = false;
// Special logic begins here
function SCOSetValue(nam,val){
var err = "";
if (!APIOK()){
AlertUserOfAPIError(g_strAPISetError + "\n" + nam + "\n" + val);
err = "false"
} else if (nam == "cmi.core.score.raw") err = privReportRawScore(val)
if (err == ""){
err = g_objAPI.LMSSetValue(nam,val.toString() + "");
if (err != "true") return err
}
if (nam == "cmi.core.score.min"){
g_bMinScoreAcquired = true;
g_nSCO_ScoreMin = val
}
else if (nam == "cmi.core.score.max"){
g_bMaxScoreAcquired = true;
g_nSCO_ScoreMax = val
}
return err
}
and this is in body html
<body bgcolor="#ffffff" onload="SCOInitialize()" onunload="SCOFinish()" onbeforeunload="SCOFinish()" >
so why its swap time after time incomplete and completed and i am try to set value for
cmi.core.lesson_status but it doesn't work
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我会将调试重点放在
g_bSetCompletedAutomatically
变量上。在其上设置一个监视,看看当您退出课程时代码是否正在调用SCOSetStatusCompleted()
。另外,如果没有看到您提供的示例中的g_bSetCompletedAutomatically
的原始值或SCOSetStatusCompleted()
的代码,真的很难给您更多指导。但这出现在您将 Lesson_status 设置为已完成的位置,因为我没有看到任何其他代码将其设置为已完成代码中的任何其他位置。对于课程完成时的问题,您可能想要查看的另一件事是在您的 SCOInitialize() 中,因为这是我看到您的代码设置 Lesson_status 的唯一位置。您需要查看 Lesson_mode 是否返回浏览,以及 Lesson_status 是否返回未尝试,以查看该代码是否是将课程设置为不完整的原因。此外,当课程处于浏览模式时,RTE 和 LMS 无论如何都应该忽略 SetValue 调用。
I would focus your debugging around the
g_bSetCompletedAutomatically
variable. Set a watch on it and see if the code is callingSCOSetStatusCompleted()
when you exit the course. Also, without seeing what the original value ofg_bSetCompletedAutomatically
or the code forSCOSetStatusCompleted()
in the samples you provided, it is really hard to give you any more direction. But that appears where you are setting the lesson_status to completed as I do not see any other code that sets it completed any where else in your code.For the issue when the course is complete, the other thing you might want to look at is in your
SCOInitialize()
as that is the only place I see your code setting the lesson_status. You need to see if lesson_mode is returning browse and lesson_status is returning not attempted to see if that piece of code is what is setting the course to incomplete. Also, when a course is in browse mode, the RTE and the LMS should ignore and SetValue calls anyway.