As3,如何将消息传递给页面中的所有swfs?

时间:2011-03-29 06:43:50

标签: actionscript-3 flash-cs4

基本上我创建了一个简单的mp3播放器,并且页面中嵌入了多个副本。现在,当我玩一个,我希望所有其他人暂停.....任何想法如何做到这一点?可以进行n路局部连接吗?还是有更好的选择?

3 个答案:

答案 0 :(得分:1)

更完整的解决方案将使用LocalSharedObject:http://www.adobe.com/products/flashplayer/articles/lso/

启动时,swf生成一个GUID,然后加载LSO并绑定到该LSO上的属性(如'currentActiveGuid')。然后,每当用户点击播放时,swf将其guid写入LSO。这将通知你所有swfs音乐正在播放,不需要javascript。这也适用于标签,所以如果swf正在另一个标签上播放,它将停止(此外,谷歌和Chrome使用相同的LSO,因此它可以跨浏览器工作:-))

答案 1 :(得分:0)

您可以使用javascript与网页进行通信,然后网页可以与其他swf进行通信。

答案 2 :(得分:0)

ExternalInterface.call可用于从 SWF调用JavaScript ,反之亦然,ExternalInterface.addCallback可用于公开某些方法通过 JavaScript

例如,在每个SWF中,您可能有:

ExternalInterface.addCallback("externalStopAudio", stopAudio);

// later..
function stopAudio():void {
    // Code to stop audio
    _audioStream.stop(); 
}

function playAudio():void {
    // tell JS to stop all audio
    ExternalInterface.call("stopAllAudio");
    // play this players audio
    _audioStream.play();
}

然后在JS中,它是包含SWF的HTML的一部分:

<script>
    // these references need to be actual pointers to the SWFs, this will vary 
    // depending on how you have it setup - might be SWFObject, Jquery, etc
    var a = [swf1, swf2, swf3];

    // called by SWF
    function stopAllAudio() {
        // called to SWF
        for(var i = 0; i < a.length; i++) {
             a[i].externalStopAudio();
        }
    }

</script>

根据安全设置/域名的位置,您可能需要以下内容:

在HTML中:

<param name="allowScriptAccess" value="always" />

在SWF中:

flash.system.Security.allowDomain(sourceDomain)

请参阅:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html#addCallback%28%29