我无法使ExternalInterface.addCallback工作 - 尝试从js按钮单击调用AS3函数

时间:2010-06-15 18:41:01

标签: javascript actionscript-3 actionscript

我正在尝试使用ExternalInterface.addCallback来允许js调用as3方法。我的代码如下:

AS:

ExternalInterface.addCallback("sendToActionscript", callFromJavaScript);

function callFromJavaScript():void{ 
circle_mc.gotoAndStop("finish"); 
}

JS:

<button type="button" onclick="callToActionscript()">Switch to square</button> 
<script type="text/javascript"> 
function callToActionscript() { 
flashController = document.getElementById("jstoactest")
flashController.sendToActionscript(); 
} 
</script>

它不起作用。我做错了什么?

3 个答案:

答案 0 :(得分:1)

我在JS中将isFlashReady标志设置为FALSE。然后当加载SWF时,在触发Event.ADDED_TO_STAGE之后,我添加ExternalInterface.addCallback并将isFlashReady标志翻转为TRUE。这可以防止在SWF准备好之前调用SWF。您可能希望在下面的JS函数中抛出alert()以查看它被卡住的位置。希望这会有所帮助。

JS:

var isFlashReady = false;
function thisMovie(movieName)
{
     if (navigator.appName.indexOf("Microsoft") != -1)
     return window[movieName];
}else{
     return document[movieName];
}
function callToActionScript(value)
{
     if(isFlashReady)
     {
          thisMovie("SWFID").sendToActionScript();
     }
}
function flashReady(value)
{
     isFlashReady = true;
}

AS

if (ExternalInterface.available) {
        try {
                ExternalInterface.addCallback("sendToActionScript", callFromJavaScript);
                flash.external.ExternalInterface.call(flashReady,true);
            } catch (error:SecurityError) {
                trace("A SecurityError occurred: " + error.message + "\n");
            } catch (error:Error) {
                trace("An Error occurred: " + error.message + "\n");
            }
} else {
            trace("External interface is not available for this container.");
}

答案 1 :(得分:0)

确保在嵌入Flash时将AllowScriptAccess设置为“always”或“sameDomain”,看看是否有帮助。 livedocs

答案 2 :(得分:0)

您的SWF文件是否与HTML页面在同一个域中提供?如果域名不同,则您需要使用Security.allowDomain来允许两者进行通信。

另外,我找到了调试Flash的最简单方法 - &gt; JavaScript通信是使用FireBug for Firefox。 (对不起,我只能发一个链接!)