如何在JavaScript中调用动态创建的Flash外部接口?

我拥有的:

  • swf通过ExternalInterface导出功能
  • JavaScript创建新的嵌入对象并将其添加到文档中
  • 调用Flash功能在其他浏览器中工作正常
  • IE 8中调用闪光灯功能将失败
  • 在swf中导出函数的示例:

    flash.external.ExternalInterface.addCallback("isActive", ...
    

    创建嵌入对象的示例:

    var b = document.createElement('embed');
    
        b.type = 'applicationu002fx-shockwave-flash';
        b.setAttribute('allowFullScreen', 'true');
        b.setAttribute('allowNetworking', 'all');
        b.setAttribute('allowScriptAccess', 'always');
        b.width = 500;
        b.height = 400;
        b.src = 'assetsu002fUltra4.UltraApplicationu002fUltra4.UltraApplication+UltraSprite.swf';
    

    在javascript中调用flash外部接口的示例:

       try
        {
          e = b.isActive();
        }
        catch (__exc){ }
    

    在IE中它会捕获消息“对象不支持这个属性或方法”

    如何解决它?

  • 相关:http://bojolais.livejournal.com/251383.html
  • 相关:ExternalInterface在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文档中

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

    希望这些帮助。


    我发现,对于IE,从ActionScript调用Javascript,我需要为object标签提供一个“id”属性。 处理ExternalInterface.call(...)的IE方式是调用对象的方法。 IE发布代码

    document.getElementById("...").SetReturnValue(...)
    

    没有你的对象标签上的id属性,这减少到

    document.getElementById("").SetReturnValue(...)
    

    它尝试在空对象上调用SetReturnValue。

    请注意,其他浏览器不需要“id”属性,但也不会真正伤害。

    您的情况可能会发生类似的情况: 嵌入式中的“名称”属性可能会有所帮助。


    难道这是为了处理你创建Embed标签而不是Object标签的事实吗? IE传统上使用Object标签来嵌入Flash内容

    请参阅Adobe技术讨论:http://kb2.adobe.com/cps/415/tn_4150.html

    链接地址: http://www.djcxy.com/p/44359.html

    上一篇: How to call dynamically created flash external interface in IE from javascript?

    下一篇: What is the purpose of :conditions on a belongs