我在IE中有一个奇怪的情况,在我点击“刷新”后,JS无法使用ExternalInterface调用闪存。我知道电影正在加载,ExternalInterface.addCallback()
的代码似乎正在完成而没有任何错误
以下是重现步骤的简要说明:
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
。< / p>
更多信息:
我无法看到我插入电影的方式会有什么影响,但我想我会包含这些代码以确定。我的电影不受“点击激活”问题的影响,我不想在这种情况下使用SWFObject,因为在HTML5音频不可用的情况下,flash电影是一个后备。
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);
答案 0 :(得分:6)
问题是一旦swf文件缓存在浏览器中,ExternalInterface类就会停止工作。
要克服这个障碍,您必须通过以下方式修改html文件和swf文件: 注意:此解决方案在IE7中进行了测试
HTML文件 - 将参数添加到swf文件以使其唯一。因此,浏览器认为每次加载页面时都需要下载新的swf文件。
例如,如果您正在使用SWFObject库(您不需要),那么您将进行以下调整:
var cachecontrol = Math.floor(Math.random()*99999);
var flashvars = {};
var params = {};
var attributes = {id:"movie"};
swfobject.embedSWF("movie.swf?nocache"+cachecontrol, "flashcontent", "100%", "100%", "10.1.0", "expressInstall.swf", flashvars, params, attributes);
同样,添加以下元标记以确保您的html文件未缓存:
SWF档案 - 如果您从主swf加载swf文件,则必须应用相同的逻辑: var cachecontrol:String = Math.floor(Math.random()* 9999).toString(); loader.load(new URLRequest(“movie.swf?nocache =”+ cachecontrol));
以下是解决方案的来源: http://www.emanuelz.com.mx/blog/cache-control-tips-for-flash-120 注意:您不必再进行上述操作了。
答案 1 :(得分:6)
如果有人想知道为什么会发生这种情况,至少对于Internet Explorer来说,似乎Flash播放器是作为ActiveX控件加载的,它与DOM和JavaScript模块完全分开。缓存.swf时,似乎ActiveX控件可以在Javascript准备好接受来自它的事件之前加载并运行它。
这意味着当Flash尝试使用ExternalInterface添加回调时,它将失败,因为尚未加载JavaScript和DOM。
我通过等待第一个ENTER_FRAME
事件,然后在那里注册我的回调来解决问题。像这样:
protected function registerExternalCallbacks(event:Event):void {
removeEventListener(Event.ENTER_FRAME, registerExternalCallbacks);
if (ExternalInterface.available) {
ExternalInterface.addCallback("flash_play", play);
ExternalInterface.addCallback("flash_setVolume", setVolume);
ExternalInterface.call("player_ready");
}
}
// and then when the .swf loads, register the function on the event:
addEventListener(Event.ENTER_FRAME, registerExternalCallbacks);
这将使玩家等到可以可靠地添加回调,然后调用名为player_ready
的javascript函数来表示它已准备好使用。
答案 2 :(得分:2)
在不同的版本中,有一堆IE漏洞,包括ExternalInterface(以及一般的flash,ime)。大多数推荐的修复建议使用SwfObject js库,它修复了我所知道的所有内容。 http://www.timelesssky.com/blog/internet-explorer-flash-8-externalinterface-bug