【问题标题】:Captivate - LMS - SCORM communication problemsCaptivate - LMS - SCORM 通信问题
【发布时间】:2010-01-29 17:16:50
【问题描述】:

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

基本上,行为是:如果您在每张幻灯片中快速看到包含 15 张幻灯片和 1 个问题的 SCO(迷人生成的内容),我的 lms 不会跟踪所有 15 个问题,仅跟踪前 3 或 4 个问题。如果最后你要等很长时间,或者如果你把内容放慢,它工作正常。

经过大量的google搜索,以及调试和跟踪,最终我发现了两个主要问题:

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

有办法使这种同步吗?我的意思是,强制闪光等待某种方式?

2) 函数每次调用耗时较长,例如setValue第一次耗时7毫秒,最后一次调用耗时200毫秒。

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

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

谢谢

【问题讨论】:

    标签: javascript flash scorm adobe-captivate scorm2004


    【解决方案1】:

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

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

    如果您将 g_intAPIType 设置为 0,您将强制浏览器使用 FSCommand,并非所有浏览器和操作系统都支持该命令。将 g_intAPIType 设置为 1 意味着您强制浏览器使用 getURL,它是跨浏览器但有一些缺点(包括很多点击声音)。

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

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

    无论g_intAPIType 设置如何,都无法阻止内部跟踪机制使用异步waitForResponse 函数,因此无法阻止Captivate 在获取/设置数据时使用定时器;在一段时间内,您可能会开始注意到越来越长的延迟,就像您描述的那样,尤其是。如果您对 LMS 进行大量调用。

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

    【讨论】:

    • 感兴趣的人更新:Captivate 6 有一个完全重写的 SCORM 代码库,由 Rustici Software (scorm.com) 提供。 Captivate 6 不应出现此问题中描述的任何问题。
    【解决方案2】:

    一些选项:

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

    否则,您将需要在您的 SCORM Player JavaScript 中使用一些 JavaScript 魔法。我将从使用JSMin 之类的工具最小化 JS 代码开始。

    然后尝试缓存 JS 文件,以便它们只加载一次。我怀疑文件在每一帧中都被一遍又一遍地调用。

    【讨论】:

    • 关于“你可以改变你做问题的方式。而不是每帧 1 个将所有问题放在 1 帧上。”,不是一个选项,我只能控制 LMS 代码,其他人们(客户)正在做 SCO 内容。是的,我实际上有一些 JS 魔法,但是我的解决方案很复杂,并且依赖于浏览器,并且依赖于 flash 版本......我需要一个更好的方法。 (当 scorm 通信使用透明 gif 和等待光标进行时,我隐藏了闪光灯)。缓存 js 文件,是的,它们正在被缓存,但还不够。谢谢
    【解决方案3】:

    “有办法让这种同步??我的意思是,强制闪存等待某种方式?”

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

    如果您想了解任何其他 LMS 的异步问题,请使用 Firefox 进行长时间的 Captivate 测验并非常快速回答问题。一些接近尾声的问题将被丢弃..”(interzoic.com 论坛)

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多