接下来是挑战:我有一部Flash电影,它将使用未知的DOM ID嵌入到页面中,我希望能够在JS函数中识别/存储回调。
我理想的用户流程是:
问题是,当AS3使用ExternalInterface.call(“functionName”,args ...)方法时,似乎没有触发DOM事件,因此无法分辨哪个对象称为JS函数,所以有一个“registerMe()”函数似乎不起作用。基本上,注入的JS函数无法确定要调用哪个DOM对象,因为Flash对象的ID是未知的。
[UPDATE] 事实证明,SWF可以使用loaderInfo.url确定自己的URL。我将这些信息传递给启动叠加体验的脚本,以便将其存储起来,以便将来与所有application / x-shockwave-flash DOM对象进行比较。找到匹配项时,即调用SWF。有没有人看到这个逻辑的缺陷? (我对JS的熟练程度不如我和AS一样)
答案 0 :(得分:5)
您正在调用的JavaScript函数是手动调用的,而不是事件。就像你在JS中使用call
或apply
方法一样。
可以做的是将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 / chrome / opera / safari读取[id]
,但我相信有几个浏览器会成功回退到[name]
。我需要做一个测试来证实这一点。
无论如何,请给an identical name
and id
并且它应该可以正常工作(您将能够根据ID选择DOM中的元素)。
答案 1 :(得分:2)
由于我假设你完全可以控制整个嵌入过程,听起来你可以告诉SWF它的DOM ID是一个flashvar,因为它是嵌入式的(无论是通过类似SWFObject的Javascript还是服务器生成的HTML)。然后,当它调用Javascript函数来触发接口时,它可以将其DOM ID作为参数发送。
不完全理想,但在浏览器上绝对可行且容易。
答案 2 :(得分:0)
我认为你不能。我能想到的唯一“干净”方式是通过Flashvars注入Flash对象的ID。 丑陋的方法是查找所有Flash对象并使用loaderInfo.url来比较和识别正确的Flash对象。