页面刷新后,ExternalInterface无法在IE中工作

| 我在IE中有一种奇怪的情况,当我点击“刷新”后,JS无法使用ExternalInterface调用Flash。我知道电影正在加载,并且执行“ 0”的代码似乎已完成,没有任何错误 以下是复制步骤的摘要: 打开IE并首次加载影片,ExternalInterface回调方法可用于JavaScript。 如果单击刷新,则回调方法不可用,并且出现错误“ 1”。 如果我清除缓存并刷新页面,它们将再次可用。 如果我然后在没有清除我的缓存的情况下再次点击刷新,则它们不可用。 如果我关闭浏览器并重新打开,它们将再次可用。 之前我已经遇到过这种情况,并且我很确定下载和实例化swf所需的额外延迟是允许ExternalInterface正确设置的原因。我之前解决此问题的方法是在swf \ url的末尾添加一个随机数,这样它就不会从缓存中使用,但这不是真正的解决方案。 有谁知道如何解决这个问题? 编辑: 我还应该提到,刷新后,\'ExternalInterface.available \'为\'true \',但是\'ExternalInterface.objectId \'为\'null \'。 我尝试将对象
id
的值随机化,并嵌入
name
和容器div的id,在每种情况下,
ExternalInterface.objectId
仍为
null
。 更多信息: 我看不到插入电影的方式会有什么不同,但是我想我会确保其中包含代码。我的电影不受“单击激活”问题的影响,在这种情况下,我不想使用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);
    
已邀请:
如果有人想知道为什么会这样,至少对于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函数来表明已准备好使用它。     
问题是,一旦在浏览器中缓存了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 注意:您无需执行上述操作。     
有很多版本不同的IE Bug,它们都带有ExternalInterface(和Flash,通常是ime)。大多数建议的修复建议使用SwfObject js库,该库修复了我所知道的所有库。 http://www.timelesssky.com/blog/internet-explorer-flash-8-externalinterface-bug     

要回复问题请先登录注册