2017-02-28 44 views
0

我想在加载Flash动画时获取当前帧。我按照这里发现的教程http://learnswfobject.com/advanced-topics/executing-javascript-when-the-swf-has-finished-loading/index.htmlSWFOBJECT CurrentFrame Javascript。我正在使用SWFObject 2.3测试版。这在Internet Explorer上工作得很好,但它不适用于Google Chrome。在Chrome中未定义的SWFObject事件在IE中工作

在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上的解决办法?

这样做的目的是为了我,如果用户真的用他打开,不只是离开它空闲的过程中创造的支票。我已经添加了一个代码来检查闲置,但这还不够。大多数学习者已经想出了一种开放课程的方式,让它在那里积累数小时的训练。有些人甚至在他们的电脑上运行一个程序,它会每隔几秒将鼠标移动一个像素,以免计算机闲置。如果我可以检查Flash电影的当前帧,我可以创建一个函数来计算用户每15分钟查看的当前页面。如果他被困在同一页面中,我可以显示一条提示,说明用户必须点击才能继续查看课程,否则会自动关闭。

+0

'e.ref'是对SWF自身的引用。它是跨浏览器的。当你说“检查e.ref.totalFrames'返回'undefined'”时,你在什么时候检查?在'setInterval'里面还是直接在'mycall'函数中? – pipwerks

+0

另外,Firefox和Safari中会发生什么(如果你在Mac上)? – pipwerks

+0

还有一个问题。 :)这是一个基于SCORM的课程吗?由Captivate或Articulate制作? – pipwerks

回答

1

我建议下降有利于监视您的通话使用JavaScript数据库的基于SWF的currentFrame方法。 (根据您的意见,这听起来像是由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; 
    } 
} 

这是一个粗略的草图,但希望你的想法。

+0

我也会试试这个。目前,我正在为用户所在的当前页面使用lesson_location。我会测试一下。谢谢! –

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 
相关问题