为什么Internet Explorer无法在ASPX中看到我的Flash ExternalInterface方法?
我正在使用Javascript调用嵌入在使用SWFObject的ASPX页面中的Flash影片的方法。它在Firefox中正常工作,但Internet Explorer 7和8(迄今为止)声称swfobject.getObjectById()
返回的对象“不支持此属性或方法”。我在这个网站和其他网站上发现了类似的帖子,但是我没有试过在IE中修复过这个帖子。为什么Internet Explorer无法在ASPX中看到我的Flash ExternalInterface方法?
的ActionScript 3.0类:
public class Player extends MovieClip {
public function Player()
{
Security.allowDomain("http://localhost");
ExternalInterface.addCallback("test", test);
}
public function test():void
{
debugBox.appendText("test() called successfully\n");
}
}
ASPX标记:
<head runat="server">
<script type="text/javascript" src="Scripts/swfobject.js"></script>
<script type="text/javascript">
swfobject.registerObject("myPlayer", "9.0.0", "scripts/expressInstall.swf");
</script>
</head>
<body>
<form id="form1" runat="server">
<div class="movie">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="640" height="640" id="myPlayer">
<param name="movie" value="Player.swf" />
<param name="allowscriptaccess" value="always" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="Player.swf" width="640" height="640">
<!--<![endif]-->
<a href="http://www.adobe.com/go/getflashplayer">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif"
alt="Get Adobe Flash player" />
</a>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
而且沿ASPX标记,这是试图让Flash对象,并调用其test()
方法的代码正在发生在来自第三方组件(DevExpress ASPxHiddenField)的AJAX回调中。这个回调是由用户输入Flash动画加载后触发:
<dx:ASPxHiddenField ID="filenameHiddenField" runat="server" OnCustomCallback="filenameHiddenField_CustomCallback"
SyncWithServer="False">
<ClientSideEvents EndCallback="function(s, e) {
var playerObject = swfobject.getObjectById("myPlayer");
playerObject.test();
}" />
</dx:ASPxHiddenField>
Internet Explorer的抱怨在该函数的最后一行,“对象不支持此属性或方法”。
谢谢!
原来Capabilities.isDebugger()是罪魁祸首。我从我原来的职位省略此为简洁(因为我觉得没有办法应该没关系),但在我的ActionScript类的构造函数实际上看起来是这样的:
public function Player()
{
Security.allowDomain("localhost");
if (!Capabilities.isDebugger)
{
ExternalInterface.addCallback("test", test);
}
}
我添加了检查,因为ExternalInterface.addCallback()
抛出“错误:错误#2067:ExternalInterface在此容器中不可用。ExternalInterface需要Internet Explorer ActiveX,Firefox,Mozilla 1.7.5或更高版本,或其他支持NPRuntime的浏览器。”当在Flash调试器中执行时。
显然,Internet Explorer中的Flash播放器是一个调试版本; ExternalInterface.addCallback()
从未被调用。
请参阅SWFObject's FAQ #7,它具体解决了这个问题。
这看起来很有希望,但不幸的是它没有工作。Firefox仍然可以正常工作,但Internet Explorer仍然有相同的错误。 –
ExternalInterface.addCallback应该在DOMContentLoaded中调用。
public function Player()
{
...
setTimeout(regCallBack, 10);
}
private function regCallBack():void
{
ExternalInterface.call("test", test);
}
它看起来像你缺少在第二物体嵌入标签,它是IE
尝试用实际引号字符替换URL编码引号字符id参数。 –
我相信这些引号需要转义,因为它们在EndCallback属性中的一组双引号内。试图混淆Visual Studio设计器并导致IIS报告解析器错误。 –
尝试使用双引号或加倍单引号。 –