Html 让SCORM 2004做它应该做的事情的问题

Html 让SCORM 2004做它应该做的事情的问题,html,scorm2004,scorm1.2,Html,Scorm2004,Scorm1.2,谢谢你的阅读,我希望你能帮我一把 我对SCORM没有多少经验;到目前为止,我一直在SCORM 1.2中工作,但我被要求在SCORM 2004中交付一个项目。这是一门直接在Dreamweaver中用HTML5构建的课程,我将JS链接为外部文件 应该发生什么: 1假设我正在存储课程位置,这样当您退出课程并再次打开它时,您就可以从离开它的页面开始。不幸的是,它总是从第一页开始。 2假定在您到达课程的最后一页之前,课程不应标记为已完成,但不幸的是,一旦您开始上课,它会标记为已完成 下面是我的代码示例,从

谢谢你的阅读,我希望你能帮我一把

我对SCORM没有多少经验;到目前为止,我一直在SCORM 1.2中工作,但我被要求在SCORM 2004中交付一个项目。这是一门直接在Dreamweaver中用HTML5构建的课程,我将JS链接为外部文件

应该发生什么: 1假设我正在存储课程位置,这样当您退出课程并再次打开它时,您就可以从离开它的页面开始。不幸的是,它总是从第一页开始。 2假定在您到达课程的最后一页之前,课程不应标记为已完成,但不幸的是,一旦您开始上课,它会标记为已完成

下面是我的代码示例,从三个HTML示例开始:本课的第一页、本课的中间页和本课的最后一页,然后是带有我的SCORM函数的两个JS文件

1 HTML:本课的第一页

<script type="text/javascript" language="javascript" name="mm_scormRTI" src="SCOfunctions.js"></script>
<script language="javascript">
    var currentScoPage = scoPage[ i ] ;
    SetValue("cmi.location", currentScoPage ); 
    Terminate(); // close out this SCO, we are finished
</script>
<script language="javascript">
    Initialize(); // initialize the SCO with the LMS
    var currentScoPage = GetValue("cmi.location");
    if (currentScoPage != "") {
        self.location = currentScoPage;
    }else{
        currentScoPage = scoPage[0];
    }
</script>
</head>
<body onLoad="mm_adlOnload()">
...
5 SCORM:外部文件SCOcomplete.js

var nFindAPITries = 0;
var API = null;
var maxTries = 500;

function ScanForAPI(win)
{
   while ((win.API_1484_11 == null) && (win.parent != null) && (win.parent != win))
   {
      nFindAPITries++;
      if (nFindAPITries > maxTries)
      {
         return null;
      }
      win = win.parent;
   }
   return win.API_1484_11;
}

function GetAPI(win)
{
   if ((win.parent != null) && (win.parent != win))
   {
      API = ScanForAPI(win.parent);
   }
   if ((API == null) && (win.opener != null))
   {
      API = ScanForAPI(win.opener);
   }
}
function mm_adlOnload()
{
  if (mm_adl_API != null)
  {
    mm_adl_API.SetValue("cmi.completion_status", "incomplete");
  }
}
function mm_adlOnunload()
{
  if (mm_adl_API != null)
  {
    mm_adl_API.SetValue("cmi.completion_status", "completed");
    mm_adl_API.Commit("");
    mm_adl_API.Terminate("");
  }
}
GetAPI();
我做错了什么?如果任何人至少有一个类似SCORM 2004项目的工作示例,或者能够看到我可能做错了什么,我们将不胜感激

非常非常感谢

您正在调用SetValue后立即终止。您必须在SetValue之后调用Commit,以便将数据持久保存在数据库中。否则你将在没有保存任何内容的情况下退出SCO


另外,您是否检查了scoPage[i]的值是否准确?

以您的示例为基础,结合其他内容

我没有看到cmi.exit,挂起设置。如果设置不正确,LMS通常会重新启动新的尝试清理。 通常包含在IFRAME/Frameset或AJAX加载设置“cmi.location”中的单页sco与多页sco可能不会导致您尝试实现的行为。 因此,如果您的课程/单元/章节imsmanifest.xml是由单个页面组成的,因为他们查看的每个页面,您都希望自动为他们评分,或者根据他们与之交互的内容进行评分

cmi.location“2”或您所在的任何页面-仅当您位于多页SCO中时 cmi.success\u状态已通过或失败 cmi.completion\u状态已完成或不完整 cmi.session_时间-需要ISO8601持续时间 cmi.score.scaled 1或0最小值、最大值、原始值(如果需要) cmi.exit“正常”或“暂停” 犯罪 终止

cmi.total_time-由LMS管理,他们添加上一个会话时间+当前会话时间 这一切都取决于您的单页与多页。如果单页退出,则不需要书签。LMS将在您的进度中标记TOC中已完成/评分的每个项目


祝你好运

谢谢你的反馈!一般来说,我在SCORM有点业余,但在SCORM 2004中,我是一个完全的新手。你可能是对的-我想我没有正确获取当前SCO页面的值。你通常怎么做?也许我遗漏了一些东西,比如currentscpahe=GetValuecmi.location,还有一些别的;?我的意思是在您自己的课程中-您是否确认将正确的值传递给scoPage[I]?然后在恢复课程时,检查cmi.location的值,看看它是否与您在关闭课程之前传递给scoPage[i]的内容匹配。
<script type="text/javascript" language="javascript" name="mm_scormRTI" src="SCOcomplete.js"></script>
<script language="javascript">
    var currentScoPage = scoPage[ i ] ;
    SetValue("cmi.location", currentScoPage ); 
    Terminate(); // close out this SCO, we are finished
</script>
</head>
<body onLoad="mm_adlOnload()" onUnload="mm_adlOnunload()">
...
function mm_adlOnload()
{
  if (mm_adl_API != null)
  {
    mm_adl_API.Initialize("");
    mm_adl_API.SetValue("cmi.completion_status", "incomplete");
  }
}
function mm_adlOnunload()
{
  if (mm_adl_API != null)
  {
    mm_adl_API.SetValue("cmi.completion_status", "incomplete");
    mm_adl_API.Commit("");
  }
}
GetAPI(window);

var nFindAPITries = 0;
var API = null;
var maxTries = 500;

function ScanForAPI(win)
{
   while ((win.API_1484_11 == null) && (win.parent != null) && (win.parent != win))
   {
      nFindAPITries++;
      if (nFindAPITries > maxTries)
      {
         return null;
      }
      win = win.parent;
   }
   return win.API_1484_11;
}

function GetAPI(win)
{
   if ((win.parent != null) && (win.parent != win))
   {
      API = ScanForAPI(win.parent);
   }
   if ((API == null) && (win.opener != null))
   {
      API = ScanForAPI(win.opener);
   }
}
var nFindAPITries = 0;
var API = null;
var maxTries = 500;

function ScanForAPI(win)
{
   while ((win.API_1484_11 == null) && (win.parent != null) && (win.parent != win))
   {
      nFindAPITries++;
      if (nFindAPITries > maxTries)
      {
         return null;
      }
      win = win.parent;
   }
   return win.API_1484_11;
}

function GetAPI(win)
{
   if ((win.parent != null) && (win.parent != win))
   {
      API = ScanForAPI(win.parent);
   }
   if ((API == null) && (win.opener != null))
   {
      API = ScanForAPI(win.opener);
   }
}
function mm_adlOnload()
{
  if (mm_adl_API != null)
  {
    mm_adl_API.SetValue("cmi.completion_status", "incomplete");
  }
}
function mm_adlOnunload()
{
  if (mm_adl_API != null)
  {
    mm_adl_API.SetValue("cmi.completion_status", "completed");
    mm_adl_API.Commit("");
    mm_adl_API.Terminate("");
  }
}
GetAPI();