Javascript Captivate-LMS-SCORM通信问题

Javascript Captivate-LMS-SCORM通信问题,javascript,flash,scorm,adobe-captivate,scorm2004,Javascript,Flash,Scorm,Adobe Captivate,Scorm2004,我正在开发一个符合SCORM的LMS,在Captivate生成的内容方面有一些问题 基本上,这种行为是:如果你看到一个SCO(captivate生成的内容),例如每张幻灯片中有15张幻灯片和一个问题,那么我的lms不会跟踪所有15个问题,只跟踪前3或4个问题。如果你在最后等了很长时间,或者你把内容看得很慢,那么效果很好 经过大量的谷歌搜索、调试和跟踪,我终于发现了两个主要问题: 1) Captivate-SCORM API通信是异步的(与flash-javascript通信相同)。因此,当用户快

我正在开发一个符合SCORM的LMS,在Captivate生成的内容方面有一些问题

基本上,这种行为是:如果你看到一个SCO(captivate生成的内容),例如每张幻灯片中有15张幻灯片和一个问题,那么我的lms不会跟踪所有15个问题,只跟踪前3或4个问题。如果你在最后等了很长时间,或者你把内容看得很慢,那么效果很好

经过大量的谷歌搜索、调试和跟踪,我终于发现了两个主要问题:

1) Captivate-SCORM API通信是异步的(与flash-javascript通信相同)。因此,当用户快速看到内容时,函数调用会越来越多地被释放,最后,可能用户正在回答问题15,而内容正在发送问题4信息。我无法更改Flash或JS Flash界面,因为这是Captivate提供的


有一种方法可以实现此同步??我的意思是,强迫闪光灯等等

2) 每次调用函数的时间都较长,例如,第一次调用setValue需要7毫秒,最后一次调用需要200毫秒

为了理解这个问题,这里有一个小背景: Captivate内容(实际上是所有内容,但更多的是Captivate)多次调用特定函数,即SCORM API函数之一的SetValue函数。此函数接受两个参数(fieldName,value)。第一个参数是要设置的字段的名称,第二个参数是新值。在我的实现中,此函数首先使用正则表达式验证值,然后在对象中设置值

好的,我可以添加更多的信息,但我不知道什么才是真正重要的,我不希望你在没有看到的情况下修改我的代码,但我没有想法,需要新的意见、想法和方向。。。。也许那个人问的问题是对的。。。帮助:)

谢谢

一些选项:

你可以改变你的提问方式。将所有问题放在一帧上,而不是每帧1个问题

否则,您将需要在SCORM播放器JavaScript中执行一些JavaScript魔术。我将首先使用一个工具最小化JS代码,如

然后尝试缓存JS文件,以便只加载一次。我怀疑在每一帧中都会反复调用文件。

有一种方法可以实现此同步??我的意思是,强制闪存以某种方式等待

显然,问题在于: “Captivate是唯一一个异步调用SCORM JavaScript函数的SCO。Firefox是唯一一个不强制SCO和支持JavaScript之间进行同步通信的浏览器。当在Firefox上运行的Captivate SCO向其中一个JS函数提交状态更新时,Captivate不会等待成功或失败响应在提交下一个状态更新之前,请先登录。由于Captivate的通信非常冗长,JavaScript不是多线程的,因此测验状态提交可能会相互叠加并覆盖。这可能会导致数据丢失,尤其是对于较长的测验。[…]

如果你想看到任何其他LMS的异步问题,请使用Firefox进行一次长时间的测试,并快速回答问题。接近结尾的一些问题将被忽略……。”(interniao.com论坛)

也许是一个: “当我强制g_intapType为0(进入
.htm文件),因此它强制Captivate像在IE中一样进行通信。“

为SCORM发布时,Captivate不使用同步通信方法。*根据浏览器的不同,Captivate使用FSCommand或老式的
getURL
方法与HTML文件通信;然后,HTML文件使用JavaScript通过SCORM API将数据中继到LMS

响应(如果有)从JavaScript中继到FSCommand或代理SWF(对于
getURL
),然后通过回调函数在Captivate中对其进行内部监控。这个回调函数使用计时器,这可能就是问题所在

如果您将
g_intAPIType
设置为0,则会强制浏览器使用FSCommand,这在所有浏览器和操作系统中都不受支持。将
g_intaptype
设置为1意味着您正在强制浏览器使用
getURL
,这是跨浏览器的,但有一些缺点(包括大量的点击声音)

在这两种情况下,数据都通过内部队列脚本发送,该脚本使用
waitForResponse
回调函数

您遇到的性能问题可能是由于排队造成的,而异步通信由于连接到
waitForResponse
的计时器而使问题更加复杂。更改
g_intaptype
可能只会对性能问题产生轻微影响,不过使用
getURL
g_intaptype=1
)可能有助于提高浏览器之间的一致性

无论
g_intAPIType
设置如何,您都无法阻止内部跟踪机制使用异步
waitForResponse
功能,因此无法阻止Captivate在获取/设置数据时使用计时器;在一段时间内,你可能会开始注意到越来越长的延迟,就像你描述的那样,特别是如果你给LMS打了很多电话


(*小的例外:我被告知Captivate 4和5使用外部接口,如果该项目是在AS3中构建的,并且是为SCORM 2004发布的,但似乎仍然使用队列和
waitForResponse
计时器,基本上像上面列出的异步方法一样处理外部接口。)

在Captivate中,发布scorm时,您将看到选项“在末尾发送跟踪数据”, 使用此选项,它将解决您的问题。

关于“您可以更改处理问题的方式。将所有问题放在一帧上,而不是每帧1个问题”的内容,不是