2011-05-20 42 views
10

這裏面臨的挑戰是:我有一個Flash電影,它將嵌入到一個使用未知DOM ID的頁面中,我希望能夠在JS函數中識別/存儲回調。JavaScript函數可以檢測哪個Flash DOM對象調用它?

我理想中的用戶流量將是:

  1. 用戶點擊暴扣。
  2. Flash暫停任何動畫/視頻/聲音等。
  3. Flash調用注入的JS函數來顯示覆蓋頁面的覆蓋體驗。
  4. 當用戶關閉重疊體驗時,將調用Flash對象上的回調方法。
  5. Flash繼續播放。

問題是,當AS3使用ExternalInterface.call(「functionName」,args ...)方法時,似乎沒有觸發的DOM事件,因此無法分辨哪個對象稱爲JS函數,因此具有「registerMe()」函數似乎不起作用。基本上,注入的JS函數無法確定調用哪個DOM對象,因爲Flash對象的ID是未知的。

[UPDATE] 事實證明,SWF可以使用loaderInfo.url來確定自己的url。我將這些信息傳遞給啓動覆蓋體驗的腳本,以便將來可以與所有應用程序/ x-shockwave-flash DOM對象進行比較。當找到匹配項時,這就是調用的SWF。有沒有人看到這個邏輯的缺陷? (我不像使用JS那樣精通JS)

+2

我有時會爲了讓Flash和JS一起工作而做噩夢。 – sdleihssirhc 2011-05-20 23:49:42

+0

在頁面上找到所有的SWF文件,並嘗試每個SWF文件上的回調函數總是有蠻力的方法,但這樣做會讓我感到冒險和不負責任,所以它並不是真的在桌面上。 – 2011-05-21 00:23:56

+0

你有沒有控制瑞士法郎? – 2011-05-21 03:05:21

回答

5

您調用的JavaScript函數是手動調用的,而不是事件。這就好像你在JS中使用callapply方法。

可以做的是通過DOM name/ID of the active flash video作爲參數傳遞給你打電話的功能是什麼,這樣才知道哪個DOM元素指回:

ExternalInterface.call('functionName', arg1, arg2, ..., ExternalInterface.objectID); 

一個「疑難雜症」與此方法是您需要確保object和/或embed元素的[id][name]屬性均已設置,因爲ExternalInterface.objectID將在不同瀏覽器中註冊不一致。

如果我記得沒錯,IE讀取[name]和FF /鉻/歌劇/ Safari瀏覽器閱讀[id],但我相信一對夫婦的瀏覽器將成功地退回到[name]。我需要做一個測試來證實這一點。

無論如何,給an identical name and id它應該工作正常(你可以根據ID選擇DOM中的元素)。

2

因爲我假設你完全控制了整個嵌入過程,聽起來像你可以告訴SWF它的DOM ID爲flashvar因爲它正在嵌入(無論是通過Javascript,如SWFObject還是作爲服務器生成HTML)。然後,當它調用JavaScript函數來觸發該接口時,它可以發送它的DOM ID作爲參數。

不完全理想,但在瀏覽器上確實可行且容易。

+0

不幸的是,我們沒有控制SWF的發佈......它將出現在幾個不同的廣告網絡上,並且我們無法保證我們上傳swf時設置的任何參數一旦出現就會有效。 – 2011-05-21 03:45:19

0

我不認爲你可以。我能想到的唯一「乾淨」的方式是通過Flashvars注入Flash對象的ID。 醜陋的方法是查找所有Flash對象,並使用loaderInfo.url來比較和識別正確的Flash對象。

+0

不幸的是,Flash片段的情況是它通過各種廣告網絡提供服務,因此不會有一致的ID。 – 2011-05-21 03:42:28

相關問題