Я боролся с этим последние пару часов, и я действительно не знаю, что может быть не так. Я просто пытаюсь заставить Javascript сообщать текст с Flash. Я нашел этот отличный пример с этим источником
http://blog.circlecube.com/wp-content/uploads/2008/02/ActionscriptJavascriptCommunication.zip
Я запустил html-файл локально, и он отлично работает, отправляя и получая текст из флеш-памяти. Затем я загружаю тот же самый образец в свой сервер приложений google для разработчиков и не могу отправить текст из javascript во флеш-память. Как ни странно, flash умеет отправлять текст Javascript. Может ли кто-нибудь увидеть, смогут ли они запустить это с помощью GAE? Бесконечно благодарен!
Вероятно, это не имеет отношения к движку приложений Google как таковому, поскольку все это работает в браузере - если только не существует какой-либо зависимости от сервера, о которой вы не упомянули. Если это не так ...
Если вы можете заставить Flash вызывать JavaScript с помощью ExternalInterface.call (), но не JavaScript для обратного вызова Flash, то это, вероятно, одна или две вещи: ваш обратный вызов EI и обработчик не подключены должным образом (во Flash ), или ваш JavaScript не имеет дескриптора объекта SWF в браузере.
Вы можете попробовать опубликовать код, но я знаю кое-что, что работает как в IE, так и в FireFox. Сначала код браузера:
<html>
<head>
<script language = "JavaScript" type = "text/javascript">
var swfReady = false;
function callbacksInitialized()
{
swfReady = true;
}
function helloFlash()
{
if (swfReady)
{
// Get a handle on the Flash object
var swfObject = navigator.appName.indexOf("Microsoft") != -1 ? window["HelloMac"] : document["HelloMac"] ;
// Call back into the Flash file
swfObject.helloFlash(document.getElementById("txtMessage").value);
}
}
function helloMac(message)
{
alert(message);
}
</script>
</head>
<body scroll = "no">
<div align = "center">
<object classid = "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
id = "HelloMac" width = "600" height = "300"
codebase = "http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
<param name = "movie" value = "HelloMac.swf" />
<param name = "quality" value = "high" />
<param name = "bgcolor" value = "#869ca7" />
<param name = "allowScriptAccess" value = "sameDomain" />
<embed src = "HelloMac.swf" quality = "high" bgcolor = "#869ca7"
width = "600" height = "300" name = "HelloMac" align = "middle"
play = "true"
loop = "false"
quality = "high"
allowScriptAccess = "sameDomain"
type = "application/x-shockwave-flash"
pluginspage = "http://www.adobe.com/go/getflashplayer">
</embed>
</object>
<br /><br />
<input type = "text" id = "txtMessage" value = "Hello, Flash!" /><br />
<input id = "btnSend" type = "button" value = "Send to Flash" onclick = "helloFlash();" />
</div>
</body>
</html>
А теперь код Flash (в моем случае это Flex, так что, надеюсь, он понятен):
<?xml version = "1.0" encoding = "utf-8"?>
<mx:Application xmlns:mx = "http://www.adobe.com/2006/mxml" layout = "absolute" initialize = "init()" height = "300" width = "600">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import flash.external.ExternalInterface;
private function init():void
{
addCallbacks();
}
private function addCallbacks():void
{
ExternalInterface.addCallback("helloFlash", this_helloFlash);
ExternalInterface.call("callbacksInitialized");
}
// Display a message from the host
private function this_helloFlash(message:String):void
{
Alert.show(message);
}
// Send a string to the host
private function helloMac():void
{
if (ExternalInterface.available)
{
ExternalInterface.call("helloMac", txtMessage.text);
}
}
]]>
</mx:Script>
<mx:VBox horizontalCenter = "0" verticalCenter = "0">
<mx:TextInput id = "txtMessage" text = "Hello, Mac!" />
<mx:Button id = "btnSend" label = "Send to Host" click = "helloMac()" />
</mx:VBox>
</mx:Application>
В этом примере демонстрируется вызов Flash в JavaScript с некоторым текстом и аналогичный вызов JavaScript во Flash. Некоторые моменты, на которые следует обратить внимание:
Не зная больше, я предполагаю, что это один из этих двух пунктов, поскольку это был мой опыт. Надеюсь, поможет! Я буду следить за постом и буду ждать дальнейших действий, если они у вас появятся.
Да, ответ Кристиана Нунсиато полезен. Проблема в том, что ваш swf-файл недоступен для javascript в то время, когда ваш javascript вызывает функцию flash. Уловка Кристиана гарантирует, что файл swf загружается и запускается тогда, когда он нужен вашему javascript.
Я не вижу в вашем коде вызова функции allowDomain. Без этого песочница безопасности не позволит вашему флеш-приложению взаимодействовать с флеш-памятью и наоборот на сервере. Добавьте вызов System.security.allowDomain("mydomain.com", "mySecondDomain.com", "etc.com")
для каждого домена, на котором будет выполняться флэш-приложение. Кроме того, в коде внедрения также необходимо указать доступ для JavaScript, включив параметр <param name = "allowScriptAccess" value = "always" />
.