如何从javascript中调用IE中动态创建的flash外部接口?

zpr*_*oxy 7 flash internet-explorer dom

是)我有的:

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

在swf中导出函数的示例:

flash.external.ExternalInterface.addCallback("isActive", ...
Run Code Online (Sandbox Code Playgroud)

创建嵌入对象的示例:

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';
Run Code Online (Sandbox Code Playgroud)

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

   try
    {
      e = b.isActive();
    }
    catch (__exc){ }
Run Code Online (Sandbox Code Playgroud)

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

怎么解决?

  1. 相关:http://bojolais.livejournal.com/251383.html
  2. 相关:ExternalInterface在IE中不起作用
  3. 相关:http://swfupload.org/forum/generaldiscussion/985
  4. 相关:http://code.google.com/p/doctype/wiki/ArticleFixingFlashExternalInterface
  5. 相关:http://www.dangerouslyawesome.com/2006/10/20/another-swfobject-problem-deproblemed/
  6. 相关: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;
}
Run Code Online (Sandbox Code Playgroud)

jon*_*ung 3

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

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

b.name = "NewFlashMovie";
Run Code Online (Sandbox Code Playgroud)

2) 您需要使用外部函数以不同的方式调用“isActive”函数。首先添加这个功能

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

然后你可以像这样调用该函数

thisMovie("NewFlashMovie").isActive();

根据我的经验,这个“thisMovie”对于桥接 IE-Flash 调用至关重要。这也记录在ExternalInterface文档中

3)我还建议使用swfobject而不是创建您自己的“嵌入”对象。

希望这些有帮助。