AS3的ExternalInterface.addCallback无法正常工作

4
我正在尝试从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个回答

8

问题在于,在您尝试调用它时,SWF文件并没有完全加载。Flash播放器可能已经加载,但是加载和初始化swf文件需要一些时间。

您需要做的是在SWF文件加载完成后从SWF文件中调用javascript函数,并将您的javascript代码放在那里,而不是现在似乎在页面加载处理程序中执行。这样,您就知道您的Flash应用程序已经正确初始化。 您正在使用的ExternalInterface类有方法可以让您回调到javascript。


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];
    }
}

0

成功的摘要:


我正在使用由Flash发布时设置的AC_RunActiveContent.js
我的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);

我尝试了1ms和100ms,但结果不稳定。在PC上,使用1000ms可以在IE、FF和Safari上运行。尚未在Mac OS X上进行检查。

显然,关键是要允许所有对象和所有对象连接设置时间。我不知道最短的时间是多少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接