Вызов функции в ActionScript 3.0 / Flash из JavaScript с использованием ExternalInterface - PullRequest
1 голос
/ 28 апреля 2011

Я не могу заставить это работать даже после того, как удостоверился, что для "allowScriptAccess" всегда.Я успешно поместил флэш-фильм в браузер, вызвал функцию ReceiveDataFromFlashMovie () и напечатал «Got here», но похоже, что GetFlashMovieObject () возвращает только NULL в соответствии с сообщением об ошибке в Internet Explorer.Я что-то упустил?

Заголовок HTML-файла:

<script type="text/javascript">
function getFlashMovieObject(movieName)
{
  if (navigator.appName.indexOf("Microsoft") != -1) { 
    return window[movieName] 
  } 
  else { return document[movieName] }
}

function ReceiveDataFromFlashMovie()
{
     document.write("Got here");
     var callResult = getFlashMovieObject("MakingButtons").myFunction();
     return callResult;
}

</script>

HTML:

<script type="text/javascript">
document.write("Hello World.")
ReceiveDataFromFlashMovie();
document.write(callResult)
</script>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="500" height="500" id="MakingButtons" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="movie" value="MakingButtons.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="MakingButtons.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="MakingButtons" align="middle" allowScriptAccess="always" swlliveconnect="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

ActionScript 3.0:

import flash.text.TextField;
import flash.external.*;
// The name of the Flash variable to be called in JavaScript
var flashFunction:String = "myFunction";
var instance:Object = null;

// Callback function executed by the name of variable
var realFunction:Function = callMe;
ExternalInterface.addCallback(flashFunction, realFunction);

var foo = "Goodbye!";
function callMe():String
{
    return foo;
}

Спасибовы!

Ответы [ 3 ]

2 голосов
/ 28 апреля 2011

Насколько я понимаю вашу проблему, единственное, что вам нужно сделать, это изменить порядок:)

поместить

<script type="text/javascript">
document.write("Hello World.")
ReceiveDataFromFlashMovie();
document.write(callResult)
</script>

после встраивания кода объекта. Он не нашел его (вернул undefined), потому что он еще не был внедрен.

1 голос
/ 28 апреля 2011

Если вы используете swfObject для встраивания вашего флэш-фильма, вы можете использовать swfobject.getObjectById для обнаружения вашего swf и вызова ваших методов.

swfobject.getObjectById("MakingButtons").myExternalMethod();

Если вы не используете swfObject, просто скопируйте и вставьте метод getObjectById в свой код JS:

function getObjectById(objectIdStr) {
        var r = null;
        var o = getElementById(objectIdStr);
        if (o && o.nodeName == "OBJECT") {
            if (typeof o.SetVariable != UNDEF) {
                r = o;
            }
            else {
                var n = o.getElementsByTagName(OBJECT)[0];
                if (n) {
                    r = n;
                }
            }
        }
        return r;
    }

И позвони, выполнив:

getObjectById("MakingButtons").myExternalMethod();

Посмотрите на это, на самом деле я пишу небольшой пример в своем блоге: http://www.nelsond8.com/?p=515

0 голосов
/ 28 апреля 2011

Вы не разрешаете SWF загружать / инициализировать.
Прежде чем вы сможете получить доступ к чему-либо внутри SWF, вы должны убедиться, что он готов к обработке обратных вызовов.

...