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
我想在加载 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