【问题标题】:Why does Internet Explorer fail to see my Flash ExternalInterface method in ASPX?为什么 Internet Explorer 在 ASPX 中看不到我的 Flash ExternalInterface 方法?
【发布时间】:2011-09-19 20:26:57
【问题描述】:

我正在使用 Javascript 调用使用 SWFObject 嵌入在 ASPX 页面中的 Flash 电影的方法。它在 Firefox 中运行良好,但 Internet Explorer 7 和 8(到目前为止)声称 swfobject.getObjectById() 返回的对象“不支持此属性或方法”。我在这个网站和其他网站上发现了类似的帖子,但我没有尝试在 IE 中解决此问题。

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(&quot;myPlayer&quot;);
    playerObject.test();
}" />
</dx:ASPxHiddenField>

Internet Explorer 抱怨该函数的最后一行,“对象不支持此属性或方法”。

谢谢!

【问题讨论】:

  • 尝试用实际的引号字符替换 url 编码的引号字符。
  • 我相信这些引号需要转义,因为它们位于 EndCallback 属性中的一组双引号内。尝试这样做会使 Visual Studio 设计者感到困惑,并导致 IIS 报告解析器错误。
  • 尝试双引号或双引号。
  • 将 ' 更改为 $quot;不是逃避它就是对它进行 URLencoding。在用双引号(“)包裹的字符串中,您可以使用单引号('),因此将 $quot; 更改为 ' 应该没问题。
  • 这不是问题。 DevExpress 为其客户端事件提供了一个自定义编辑器,并以这种方式生成代码;正如我在原帖中所说,这在 Firefox 中运行良好。在普通 JavaScript 函数(DevExpress 控件之外)中调用 swfobject.getObjectById("myPlayer").test() 在 Internet Explorer 中会导致相同的错误,但在 FF 中不会。由于某种原因,IE 只是看不到ExternalInterface.addCallback() 公开的方法。

标签: javascript asp.net flash internet-explorer swfobject


【解决方案1】:

看起来您缺少用于 IE 的第二个对象嵌入标记中的 id 参数

【讨论】:

    【解决方案2】:

    请参阅SWFObject's FAQ #7,它专门解决了这个问题。

    【讨论】:

    • 这看起来很有希望,但不幸的是它没有奏效。 Firefox 仍然可以正常工作,但 Internet Explorer 仍然有同样的错误。
    【解决方案3】:

    原来 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() 从未被调用过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2017-03-01
      相关资源
      最近更新 更多