【发布时间】:2011-05-26 04:00:51
【问题描述】:
我在 IE 中有一个奇怪的情况,在我点击“刷新”后,JS 无法使用 ExternalInterface 调用 Flash。我知道电影正在加载,ExternalInterface.addCallback() 的代码似乎正在完成,没有任何错误
以下是重现步骤的概要:
- 首次打开 IE 并加载电影,JavaScript 可以使用 ExternalInterface 回调方法。
- 如果我点击刷新,回调方法不可用,我收到错误
Object doesn't support this property or method。 - 如果我清除缓存并刷新页面,它们将再次可用。
- 如果我在不清除缓存的情况下再次点击刷新,它们将不可用。
- 如果我关闭浏览器并重新打开,它们就会再次可用。
我以前遇到过这种情况,我很确定下载和实例化 swf 所需的额外延迟是允许 ExternalInterface 正确设置的原因。我之前解决这个问题的方法是在 swf 的 url 末尾添加一个随机数,这样它就不会从缓存中使用,但这不是一个真正的解决方案。
有人知道怎么解决吗?
编辑:
我也应该提到刷新后,“ExternalInterface.available”为“true”,但“ExternalInterface.objectId”为“null”。
我尝试随机化对象 id 的值并嵌入 name 和容器 div 的 id,在每种情况下,ExternalInterface.objectId 仍然是 null。
更多信息:
我看不出插入电影的方式会有什么不同,但我想我会包含代码以确保安全。我的电影不受“点击激活”问题的影响,我不想在这种情况下使用 SWFObject,因为 Flash 电影是 HTML5 音频不可用时的后备。
var docContainer = document.createElement('div');
docContainer.innerHTML = '<object '
+ 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '
+ 'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" '
+ 'id="mp3player" '
+ 'width="300" '
+ 'height="500">'
+ '<param name="allowScriptAccess" value="always" />'
+ '<param name="movie" value="mp3player.swf" />'
+ '<param name="quality" value="high" />'
+ '<param name="bgcolor" value="#ffffff" />'
+ '<embed '
+'src="mp3player.swf" '
+ 'quality="high" '
+ 'bgcolor="#ffffff" '
+ 'width="300" '
+ 'height="500" '
+ 'swLiveConnect="true" '
+ 'name="mp3player" '
+ 'id="mp3player" '
+ 'allowScriptAccess="always" '
+ 'type="application/x-shockwave-flash" '
+ 'pluginspage="http://www.adobe.com/go/getflashplayer" />'
+ '</object>';
document.body.appendChild(docContainer);
【问题讨论】:
-
当你调用 JS 方法 SWF 时,我的意思是说在哪个事件上?
-
@Andrew:你找到解决这个错误的方法了吗?不使用 SwfObject 可以解决吗?
-
没有。我从没干过。鉴于我最初的观察和@Paul 在他的回答中的评论,我认为最好的办法是在页面的
onload事件触发后尝试加载内容(这是 swfobject 所做的)。在我的例子中,我只是在 IE 用户的 SWF 名称中随机分配了一个查询字符串变量,并且错误不再是一个因素,尽管这违背了理智的缓存策略。两种解决方案都不是最优的。
标签: javascript flash actionscript-3 internet-explorer