2011-05-20 65 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

相关问题