Chrome 中未定义的 SWFObject 事件适用于 IE

SWFObject event undefined in Chrome works in IE

我想在加载 Flash 影片时获取它的当前帧。我遵循了此处找到的教程 http://learnswfobject.com/advanced-topics/executing-javascript-when-the-swf-has-finished-loading/index.html and SWFOBJECT CurrentFrame Javascript。我正在使用 SWFObject 2.3 测试版。这在 Internet Explorer 上工作得很好,但在 Google Chrome 上不起作用。

在Chrome中我得到了错误

Uncaught TypeError: e.ref.currentFrame is not a function

正在检查 e 它 returns [object Object] 正在检查 e.ref returns [object HTMLObjectElement] 正在检查 e.ref.totalFrames returns undefined

var flashvars = {};
var params = {};
var attributes = {};
function mycall(e){
    setInterval(function(){console.log("Frame: " + e.ref.currentFrame)},1000);
}
swfobject.embedSWF("notmyswf.swf", "course", "100%", "100%", "6.0.0", false, flashvars, params, attributes, mycall);

为什么这在 Chrome 上不起作用,但在 IE 上运行良好?未检测到事件e?是否有关于如何在 Chrome 上进行这项工作的解决方法?

这样做的目的是让我检查用户是否真的在使用他打开的课程,而不是让它闲置。我已经添加了一个代码来检查空闲状态,但这还不够。大多数学习者已经找到了一种方法,只需打开一门课程,就可以将其留在那里以积累数小时的培训时间。有些人甚至在他们的计算机中安装了一个程序 运行,它会每隔几秒将鼠标移动 1 个像素,这样计算机就不会闲置。如果我可以检查 Flash 电影的当前帧,我可以创建一个函数来计算用户每 15 分钟正在查看的当前页面。如果他停留在同一页面,我可以显示提示,用户必须单击才能继续查看课程,否则课程将自动关闭。

我建议放弃基于 SWF 的 currentFrame 方法,转而使用 JavaScript 监控您对数据库的调用。 (根据您的评论,听起来数据库调用是由 JS 发送的,所以这应该不是问题。)

如果课程书签每 3 分钟自动保存一次(如您的评论中所述),您可以将该值缓存在页面的 JS 中,并在每次保存时进行比较。如果该值在 x 分钟内未更改,您可以显示超时警告。

如果您使用的是 SCORM 包装器(或类似包装器),这非常简单,只需修改包装器以包含您的计时器代码即可。类似于:

//Old code (pseudocode, not tested)
function setBoomark (val){
    API.SetValue("cmi.core.lesson_location", val);
}

//New code (pseudocode, not tested)
var current_location = "";

var activityTimer;

function disableCourse(){
    //do stuff to disable course because it timed out
}

function setBoomark (val){
    API.SetValue("cmi.core.lesson_location", val);
    if(val === current_location){
        //do nothing, timer keeps ticking
    } else {
        //reset timer using new bookmark value
        if(activityTimer){ clearTimeout(activityTimer); }
        activityTimer = setTimeout(disableCourse, 15000);
        //Update current_location value
        current_location = val;
    }
}

这是一个粗略的草图,但希望您能理解。

我觉得自己很蠢!

它在 Chrome 和 Firefox 中不起作用,因为我为这些函数使用了错误的外壳,但在 IE11 中它无论如何都可以工作。

所以正确的函数是:

e.ref.CurrentFrame() //I used currentFrame() which still works in IE11
e.ref.TotalFrames() //I used totalFrames() which still works in IE11
e.ref.PercentLoaded() //I used this correctly and was able to get the value