4

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

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

我想做的就是用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));

}

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

4

3 回答 3

8

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

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

于 2008-11-21T15:39:26.850 回答
1

使用此代码获取 swf 对象。

我在以下位置测试了这段代码:

  • 即 9,8,7
  • 火狐 6.0.1
  • 网景导航器 9.0.0.6
  • 歌剧 11.5
  • 谷歌浏览器 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];
    }
}
于 2011-09-06T13:34:32.007 回答
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);

我尝试了 1ms 和 100ms,但结果参差不齐。用 1000 毫秒,这可以在 PC 上的 IE、FF 和 Safari 中运行。没有在 Mac OS X 上检查过。

显然,关键是让所有对象和所有对象连接都有时间建立起来。我不知道最短时间是多少。

于 2009-03-03T17:26:54.520 回答