IE中的Flash和JavaScript通信

时间:2010-07-21 05:58:58

标签: javascript html flash actionscript-3 flash-cs4

我遇到的问题是IE使用Flash CS4中的EternalInterface类将字符串传回swf。

我有一个带有以下代码的swf:

var externalString:String = ExternalInterface.call("IncomingJS")

位于附加到Event.ENTERFRAME的事件侦听器内,以及等待ExternalInterface.available的if语句。

IncomingJS函数如下所示:

function IncomingJS() {
   return stringFromHTML;
}

并使用swf坐在HTML页面上。

我能够成功获取externalString变量,并在Firefox,Safari和Chrome中使用其余的AS3脚本,但不能在IE中使用。

如果我在Javascript中的return语句之前添加alert (stringFromHTML),我会得到stringFromHTML垃圾邮件的值,看起来Flash正在以正确的速率触发该函数。

用于swf的HTML嵌入代码有点简单:

<object width="750" height="200" id="controlledScale"><param name="movie" value="http://www.myURL.com/controlledScale.swf"><param name="allowScriptAccess" value="sameDomain" /><embed src="http://www.myURL.com/controlledScale.swf" width="750" height="200" allowScriptAccess="sameDomain"></embed></object>

非常感谢任何帮助或建议。

谢谢, DavidB

修改

我意识到SWF嵌入代码有多糟糕。 不幸的是,HTML代码实际上是在第三方HTML生成器中工作,其中一个限制是我一次只能拥有一行(无限长度)的html。

其他选项(swfObject等)是否能够在代码中没有换行符运行,或者我是否要求使用Javascript和SWF来解决问题,而不是直接嵌入SWF,使用类似iFrame和请参考“正确的”flash delpoyment html文件?

在这一点上有点我甚至不确定问题实际位于何处。 swf是发现在所有浏览器上发送到Javascript,只是没有在IE中获取信息。

3 个答案:

答案 0 :(得分:0)

您必须在对象标记中添加id才能在IE中使用。

<object width="750" id="myflash" height="200"><param name="movie" value="http://www.myURL.com/controlledScale.swf"><param name="allowScriptAccess" value="sameDomain" /><embed src="http://www.myURL.com/controlledScale.swf" width="750" height="200" allowScriptAccess="sameDomain"></embed></object>

答案 1 :(得分:0)

我非常确定IE中有一个安全“功能”可以阻止JS从Flash调用太多次,以阻止它崩溃浏览器。

你有必要每帧调用一次吗?

我建议不惜一切代价,因为这会对浏览器造成很大的压力。

*****编辑*****

如果你想从JS调用ExternalInterface方法 - &gt;在IE中使用Flash,您必须略微区别地引用该对象,如下所示:

function thisMovie(movieName) {
  if (navigator.appName.indexOf("Microsoft") != -1) {
    return window[movieName];
  } else {
    return document[movieName];
  }
}

然后,一旦确定要传递的字符串构造正确,就可以从JS中调用它:

thisMovie( "theFlashElementID" ).giveMeMyStringAlready();

然后在你的Flash中你会有这样的东西:

if( ExternalInterface.available ) 
{
  ExternalInterface.addCallback( "giveMeMyStringAlready", handleTheStringFromJS );
}
  else
{
  handleTheFactIDontHaveExternalInterfaceAvailable();
  // the only reason this would be is if container that 
  // is embedding the swf isn't fully loaded by the browser
}

AS3 docs关于ExternalInterface的杰出代码是:

  

注意:使用外部API时   HTML,始终检查HTML有   在尝试之前完成加载   调用任何JavaScript方法。

答案 2 :(得分:0)

此:

  

不幸的是,HTML代码是   实际上是在第三方工作   HTML生成器

是问题。

swf位于<form>标记内。 在浏览器阶段,有大量非常冗长的代码,我在html代码的开头和结尾都错过了标签。

感谢您的帮助。如果我从经验中没有学到任何东西,那就是充满了问题并远远超出眼前的问题,尽可能地完全打破每个元素。