我是从flash发布html,这是flash +SCORM1.2,我的html包含.swf,因为player .swf player会有菜单和学生从这个swf导航页面,所以课程的状态应该在学生到达最后一页时完成,但是我发生了什么呢?当第一次访问课程并关闭>>时,课堂状态是不完整的,这是正确的,但是当第二次打开课程时,状态更改为已完成,第三次更改为不完整的..4th时,我不知道发生了什么,这是我使用的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设置值,但它不起作用
发布于 2011-03-19 21:23:32
我将把调试的重点放在g_bSetCompletedAutomatically变量上。设置一个监视,看看您退出课程时代码是否正在调用SCOSetStatusCompleted()。而且,在您提供的示例中看不到g_bSetCompletedAutomatically的原始值或SCOSetStatusCompleted()的代码,就很难给出更多的方向。但这将显示您将lesson_status设置为已完成的位置,因为我没有看到任何其他代码设置它完成在代码中的任何其他位置。
对于课程完成后的问题,您可能需要查看的另一件事是在您的SCOInitialize()中,因为这是我看到您的代码设置lesson_status的唯一地方。您需要查看lesson_mode是否返回、浏览、和lesson_status是否返回,而不是尝试,以查看这段代码是否将课程设置为不完整。另外,当一个课程处于浏览模式时,RTE和LMS应该忽略并无论如何调用SetValue。
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")
}
}https://stackoverflow.com/questions/5259281
复制相似问题