as3 ExternalInterface.addCallback无法正常工作

时间:2008-11-19 18:11:57

标签: javascript actionscript-3 externalinterface addcallback

我试图从javascript访问swf,所以在livedocs中的这个例子就是我想要修改的内容。 http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html#includeExamplesSummary

但是,由于某种原因,它无法正常工作。我遇到的问题 是它在Safari和Firefox中不起作用,它只有在我发出警报时才有效 在javascript将值传递给swf之前的函数中。 (好像需要一些时间) 我也尝试在as3中设置一个计时器,但是计时器不起作用,只有js中的警报有帮助。

我想做的就是使用js告诉swf文件播放ep1.swf。 这是我的js代码:

document.observe('dom:loaded', function() {
    $('episode1').observe('click', function() {
        var params = {wmode : "transparent", allowScriptAccess:"always", movie:"header"};
        swfobject.embedSWF("swf/float.swf", "header", "100%", "100%", "9.0.0","expressInstall.swf", "", params, "");
        sendToActionScript("ep1.swf");
    });
})
function thisMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[movieName];
    } else {
        //alert("aaa")
        return document[movieName];
    }
}
function sendToActionScript(value) {     
    thisMovie('header').sendToActionScript(value);       
}

这是我的as3代码:

private function receivedFromJavaScript(value:String):void {

    loader.load(new URLRequest(value));

}

我已经尝试了很长时间,有谁知道如何解决这个问题?感谢。

3 个答案:

答案 0 :(得分:8)

问题是,当您尝试调用SWF文件时,SWF文件未完全加载。 Flash播放器可能已加载,但加载和初始化swf文件需要一段时间。

你需要做的是在加载时从SWF文件调用javascript函数并将你的javascript放在那里而不是你现在正在做的页面加载处理程序。这样你就知道你的flash应用程序已经正确初始化了。您正在使用的ExternalInterface类具有允许您回调到javascript的方法。

答案 1 :(得分:1)

使用此代码获取swf对象。

我测试了这段代码:

  • IE 9,8,7
  • Firefox 6.0.1
  • Netscape Navigator 9.0.0.6
  • Opera 11.5
  • Google Chrome 13.0.782.215
  • Safari 3.2(全部在Windows操作系统中)

它工作正常。

function GetSWF(strName) {
    if (window.document[strName] != null) {
        if (window.document[strName].length == null)
            return window.document[strName];
        else
            return window.document[strName][1];
    } else {
        if (document[strName].length == null)
            return document[strName];
        else
            return document[strName][1];
    }
}

答案 2 :(得分:0)

成功摘要:


我正在使用AC_RunActiveContent.js,由Flash在发布时设置 我的swf名为fvar_js,如下所示:

AC_FL_RunContent(
        ...
    'src', 'fvar_js',
        ...

我强调这是因为我从不必使用像thisMovie这样的函数 在上面的帖子中指向swf对象。我能够使用 fvar_js直接(好吧,有点,正如你将看到的那样)。


在我的as3代码中,我有以下几行:

if (ExternalInterface.available) {
    ExternalInterface.addCallback("js_to_as_f", js_from_as_f);
}

其中js_from_as_f是一个更改文本字段中文本的函数。


在HTML中我设置了以下内容:

var timeoutId;
var js_initiate_callback = function() {
    // This is the swf object:
    fvar_js.js_to_as_f();
    clearTimeout ( timeoutId );
}
var reset_fvar_f = function(new_val) {
    fvar_val = new_val;
}
//js_initiate_callback();
timeoutId = setTimeout(js_initiate_callback, 1000);

我尝试了1毫秒和100毫秒,但结果不稳定。 1000毫秒 这适用于PC上的IE,FF和Safari。尚未检查Mac OS X.

显然,关键是允许所有对象和所有对象连接 是时候设置了。我不知道最短时间是什么。