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

时间:2017-02-28 03:12:14

标签: javascript google-chrome internet-explorer flash swfobject

我想在加载时获取我的Flash电影的currentFrame。我按照http://learnswfobject.com/advanced-topics/executing-javascript-when-the-swf-has-finished-loading/index.htmlSWFOBJECT CurrentFrame Javascript中的教程进行操作。我正在使用SWFObject 2.3 beta。这在Internet Explorer上完全正常,但它在Google Chrome上无效。

在Chrome中我收到错误

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

检查e它会返回[object Object] 检查e.ref会返回[object HTMLObjectElement] 检查e.ref.totalFrames会返回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分钟查看一次的当前页面。如果他被困在同一页面,我可以显示一个提示,用户必须单击才能继续查看该课程,否则它将自动关闭。

2 个答案:

答案 0 :(得分:1)

我建议放弃基于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;
    }
}

这是一幅粗略的草图,但希望你明白这一点。

答案 1 :(得分:1)

我觉得自己很蠢!

它在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