Проблема с Flash ExternalInterface в Google App Engine

Я боролся с этим последние пару часов, и я действительно не знаю, что может быть не так. Я просто пытаюсь заставить Javascript сообщать текст с Flash. Я нашел этот отличный пример с этим источником

http://blog.circlecube.com/wp-content/uploads/2008/02/ActionscriptJavascriptCommunication.zip

Я запустил html-файл локально, и он отлично работает, отправляя и получая текст из флеш-памяти. Затем я загружаю тот же самый образец в свой сервер приложений google для разработчиков и не могу отправить текст из javascript во флеш-память. Как ни странно, flash умеет отправлять текст Javascript. Может ли кто-нибудь увидеть, смогут ли они запустить это с помощью GAE? Бесконечно благодарен!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
2 876
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вероятно, это не имеет отношения к движку приложений 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. Некоторые моменты, на которые следует обратить внимание:

  • Убедитесь, что вы ждать звоните в Мигать, пока Flash не уведомит браузер готов к приему звонки (как указано моими callbacksInitialized () метод).
  • Убедитесь, что вы используете соответствующий объект, специфичный для браузера ссылка (например, window ["HelloMac"] по сравнению с документом ["HelloMac"]).

Не зная больше, я предполагаю, что это один из этих двух пунктов, поскольку это был мой опыт. Надеюсь, поможет! Я буду следить за постом и буду ждать дальнейших действий, если они у вас появятся.

Да, ответ Кристиана Нунсиато полезен. Проблема в том, что ваш swf-файл недоступен для javascript в то время, когда ваш javascript вызывает функцию flash. Уловка Кристиана гарантирует, что файл swf загружается и запускается тогда, когда он нужен вашему javascript.

Ответ принят как подходящий

Я не вижу в вашем коде вызова функции allowDomain. Без этого песочница безопасности не позволит вашему флеш-приложению взаимодействовать с флеш-памятью и наоборот на сервере. Добавьте вызов System.security.allowDomain("mydomain.com", "mySecondDomain.com", "etc.com") для каждого домена, на котором будет выполняться флэш-приложение. Кроме того, в коде внедрения также необходимо указать доступ для JavaScript, включив параметр <param name = "allowScriptAccess" value = "always" />.

Другие вопросы по теме