是)我有的:

  • swf 通过 ExternalInterface
  • 导出函数
  • Javascript 创建新的嵌入对象并将其添加到文档
  • 调用 flash 函数在其他浏览器中运行良好
  • 中调用 flash 函数将失败IE 8

  • 在 swf 中导出函数的示例:
    flash.external.ExternalInterface.addCallback("isActive", ... 
    

    创建嵌入对象的示例:
    var b = document.createElement('embed'); 
     
        b.type = 'application\u002fx-shockwave-flash'; 
        b.setAttribute('allowFullScreen', 'true'); 
        b.setAttribute('allowNetworking', 'all'); 
        b.setAttribute('allowScriptAccess', 'always'); 
        b.width = 500; 
        b.height = 400; 
        b.src = 'assets\u002fUltra4.UltraApplication\u002fUltra4.UltraApplication+UltraSprite.swf'; 
    

    javascript调用flash外部接口(interface)示例:
       try 
        { 
          e = b.isActive(); 
        } 
        catch (__exc){ } 
    

    在 IE 中,它将捕获消息 “对象不支持此属性或方法”

    如何解决?
  • 相关:http://bojolais.livejournal.com/251383.html
  • 相关:ExternalInterface not working in IE
  • 相关:http://swfupload.org/forum/generaldiscussion/985
  • 相关:http://code.google.com/p/doctype/wiki/ArticleFixingFlashExternalInterface
  • 相关:http://www.dangerouslyawesome.com/2006/10/20/another-swfobject-problem-deproblemed/
  • 相关:http://www.airtightinteractive.com/news/?p=71


  • 在脚本调试器中,我可以看到应该是桥的第三方脚本:
    function __flash__arrayToXML(obj) { 
        var s = "<array>"; 
        for (var i=0; i<obj.length; i++) { 
            s += "<property id=\"" + i + "\">" + __flash__toXML(obj[i]) + "</property>"; 
        } 
        return s+"</array>"; 
    } 
    function __flash__argumentsToXML(obj,index) { 
        var s = "<arguments>"; 
        for (var i=index; i<obj.length; i++) { 
            s += __flash__toXML(obj[i]); 
        } 
        return s+"</arguments>"; 
    } 
    function __flash__objectToXML(obj) { 
        var s = "<object>"; 
        for (var prop in obj) { 
            s += "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>"; 
        } 
        return s+"</object>"; 
    } 
    function __flash__escapeXML(s) { 
        return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;"); 
    } 
    function __flash__toXML(value) { 
       var type = typeof(value); 
        if (type == "string") { 
            return "<string>" + __flash__escapeXML(value) + "</string>"; 
        } else if (type == "undefined") { 
            return "<undefined/>"; 
        } else if (type == "number") { 
            return "<number>" + value + "</number>"; 
        } else if (value == null) { 
            return "<null/>"; 
        } else if (type == "boolean") { 
            return value ? "<true/>" : "<false/>"; 
        } else if (value instanceof Date) { 
            return "<date>" + value.getTime() + "</date>"; 
       } else if (value instanceof Array) { 
           return __flash__arrayToXML(value); 
       } else if (type == "object") { 
           return __flash__objectToXML(value); 
       } else { 
            return "<null/>"; //??? 
        } 
    } 
    function __flash__addCallback(instance, name) { 
      instance[name] = function () {  
        return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>")); 
      } 
    } 
    function __flash__removeCallback(instance, name) { 
      instance[name] = null; 
    } 
    

    请您参考如下方法:

    我不确定我是否正确理解了您的问题。但我认为你错过了几件事:

    1)您的嵌入标签需要一个名称属性。让我们将其命名为“NewFlashMovie”,用于后续代码:

    b.name = "NewFlashMovie"; 
    

    2) 您需要使用外部函数以不同方式调用“isActive”函数。首先添加这个功能
     function thisMovie(movieName) { 
         if (navigator.appName.indexOf("Microsoft") != -1) { 
             return window[movieName]; 
         } else { 
             return document[movieName]; 
         } 
     } 
    

    然后你可以像这样调用函数
    thisMovie("NewFlashMovie").isActive();
    根据我的经验,这个“thisMovie”对于连接 IE-Flash 调用至关重要。这也记录在 ExternalInterface documentation

    3) 我也推荐使用 swfobject而不是创建自己的“嵌入”对象。

    希望这些有所帮助。


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!