1

正如您可以通过标题所知道的,我在AS3 ExternalInterface和jQuery/swfobject中遇到了一些问题。jQuery swfobject AS3 ExternalInterface不工作

的ActionScript:

if (ExternalInterface.available) { 
    ExternalInterface.call('init'); 
    ExternalInterface.addCallback('testFunc', returnFunc) 
} 

function returnFunc():void { 
    ExternalInterface.call('alertFunc'); 
} 

的jQuery:

function init() { 
    alert('init'); 
    $('#swf_object').testFunc(); 
} 

function alertFunc() { 
    alert('finished'); 
} 

显然,这意味着该对象的ID为 'swf_object'

我也曾尝试通过以下获取对象:

document.getElementById('swf_object') 
document.getElementById('swf_object')[0] 
$('#swf_object')[0] 

无济于事。

它给出了第一个警报('init'),但没有做最后一个。我完全困惑,希望有人能指出我的错误! (有必然是地方大规模明显的一个)

回答

2

的问题是,你呼唤JavaScript的init()它调用闪存testFunc()你做testFunc提供之前(后只发生呼叫到init()完成)。

为了解决这个问题,只需将两行交换到这一点:

ExternalInterface.addCallback('testFunc', returnFunc); // Needs to be available before it's used 
ExternalInterface.call('init'); 

至于让JavaScript中的Flash对象,你可以直接与document.getElementById('swf_object')做到这一点,但它可能使用jQuery太:

var swf = $('#swf_object').get(0); // Get the actual object without the jQuery wrapper 
+0

我知道这将是简单的事情!我对ActionScript非常陌生,但那是非常明显的!我曾期待ActionScript继续阅读代码(如JavaScript),但事实证明它等待函数(如PHP)。我记得当我学习JavaScript时遇到了相反的问题,期待它等待函数的执行! – 2012-01-14 22:53:45

+1

@Andrew:AS3和JS(在浏览器中)在这方面实际上非常相似 - 都在单线程环境中托管,因此大量使用异步函数。但是,无论何时你调用一个函数,它都是一个同步操作(在我所能想到的所有语言中)。协调这两个概念的诀窍是启动异步操作*的函数将运行同步操作* - 它不会立即执行整个操作(只是第一个位)。 – Cameron 2012-01-14 23:00:58