【问题标题】:SWFObject event undefined in Chrome works in IEChrome 中未定义的 SWFObject 事件在 IE 中有效
【发布时间】:2017-02-28 03:12:13
【问题描述】:

我想在加载 Flash 电影时获取它的 currentFrame。我按照这里找到的教程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 中我得到错误

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 分钟计算一次用户正在查看的当前页面。如果他卡在同一页面,我可以显示一个提示,用户必须单击才能继续查看课程,否则它将自动关闭。

【问题讨论】:

  • e.ref 是对 SWF 本身的引用。它是跨浏览器的。当你说“检查e.ref.totalFrames 返回undefined”时,你在什么时候检查?在setInterval 内部还是直接在mycall 函数中?
  • 另外,在 Firefox 和 Safari 中会发生什么(如果您使用的是 Mac)?
  • 还有一个问题。 :) 这是一个基于 SCORM 的课程吗?由 Captivate 还是 Articulate 制作?
  • 我正在检查 setInterval 中的 e.ref.totalFramese.ref.currentFrame(),因为在加载 Flash 影片之前,该值在开始时不可用。
  • 该课程内部支持 SCORM 功能,效果很好。但是,我添加的这个功能是为了支持我们正在使用的常规 PHP 网络服务器。从本质上讲,该课程具有传统的发送和加载功能,可以同时从 MySQL 数据库中保存和检索数据,以及从 javascript 中发送和检索数据的代码(我实际上使用了您网站上的想法 :))

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


【解决方案1】:

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

如果课程书签每 3 分钟自动保存一次(如您的 cmets 中所述),您可以将值缓存在页面的 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;
    }
}

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

【讨论】:

  • 我也会试试这个。目前我正在为用户所在的当前页面使用课程位置。我将对此进行测试。谢谢!
【解决方案2】:

我觉得自己很蠢!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2011-02-27
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多