2017-02-28 48 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 
相關問題