首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Moodle中的Javascript &SCORM1.2

Moodle中的Javascript &SCORM1.2
EN

Stack Overflow用户
提问于 2011-03-10 11:55:49
回答 1查看 2.6K关注 0票数 0

我是从flash发布html,这是flash +SCORM1.2,我的html包含.swf,因为player .swf player会有菜单和学生从这个swf导航页面,所以课程的状态应该在学生到达最后一页时完成,但是我发生了什么呢?当第一次访问课程并关闭>>时,课堂状态是不完整的,这是正确的,但是当第二次打开课程时,状态更改为已完成,第三次更改为不完整的..4th时,我不知道发生了什么,这是我使用的javascript函数:

代码语言: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中的

代码语言:javascript
复制
<body bgcolor="#ffffff" onload="SCOInitialize()" onunload="SCOFinish()" onbeforeunload="SCOFinish()" >

那么,为什么它的交换一次又一次地不完整和完成--我试图为cmi.core.lesson_status设置值,但它不起作用

EN

回答 1

Stack Overflow用户

发布于 2011-03-19 21:23:32

我将把调试的重点放在g_bSetCompletedAutomatically变量上。设置一个监视,看看您退出课程时代码是否正在调用SCOSetStatusCompleted()。而且,在您提供的示例中看不到g_bSetCompletedAutomatically的原始值或SCOSetStatusCompleted()的代码,就很难给出更多的方向。但这将显示您将lesson_status设置为已完成的位置,因为我没有看到任何其他代码设置它完成在代码中的任何其他位置。

对于课程完成后的问题,您可能需要查看的另一件事是在您的SCOInitialize()中,因为这是我看到您的代码设置lesson_status的唯一地方。您需要查看lesson_mode是否返回、浏览、和lesson_status是否返回,而不是尝试,以查看这段代码是否将课程设置为不完整。另外,当一个课程处于浏览模式时,RTE和LMS应该忽略并无论如何调用SetValue。

代码语言:javascript
复制
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")
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5259281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档