Обратный вызов ExternalInterface не работает

Я пытаюсь вызвать функцию в моем ActionScript из моего JavaScript, мне удалось успешно сделать это с другим файлом flash, но в текущем он по какой-то причине не работает. Я использую jQuery SWFEmbed, это мой код JS:

$.ajax({
        url: '<?php echo $html->url(array('controller' => 'voicenotes', 'action' => 'get_url'), true);?>' + '/' + container.children('#VoicenoteVnid').val(),
        dataType: 'json',
        type: 'POST',
        success: function(response) {
          container.children('.voicenote-info').children('.player').addClass('active');
          flashMovie = container.children('.voicenote-info').children('.player');
          alert(flashMovie.html());
          flashMovie.flash({
            swf: '<?php echo $html->url('/files/flash/reproductor_compact.swf',true); ?>',
            width: 240,
            height: 40,
            quality: "high",
            wmode: "transparent",
            allowscriptaccess: "always",
          });
          alert($('.player.active > object')[0].callIt());
        }              
      });

А вот мой код AS, он в моем конструкторе:

public function reproductor()
        {
            ExternalInterface.addCallback("callIt", test);
            ExternalInterface.call("alert", "Que fue?");
            trace(ExternalInterface.available);
        }

И это моя функция:

private function test():String {
            return "this is a test";
        }

ExternalInterface.call работает, и трассировка выводит истину, я понятия не имею, что происходит.

P.S: Если бы вы также могли сказать мне, как я могу передать параметры обратному вызову ExternalInterface, я был бы признателен.


person 8vius    schedule 26.10.2011    source источник
comment
Следующий ответ о переполнении стека может содержат ссылки на вашу конкретную проблему.   -  person Vladimir Tsvetkov    schedule 27.10.2011


Ответы (1)


  1. Возможно, ваш селектор JQuery для поиска вашего SWF-объекта неверен. Почему бы вам не попробовать сделать это по-другому, просто для отладки?
  2. Возможно, вы вызываете свою функцию AS3 до полной загрузки SWF. Почему бы вам не попробовать поместить этот вызов функции (callIt) в кнопку, за пределами этого Ajax, и нажать ее после вызова вашего предупреждения?

Чтобы получить параметр в вашей функции обратного вызова, просто отправьте его с помощью JS и получите в качестве аргумента в своей функции обратного вызова. Бывший.:

$('.player.active > object')[0].callIt("LOLSOME")

...

ExternalInterface.addCallback("callIt", test);
private function test(arg:String):String {
        return "param received from JS: " + arg;
}
person Marcelo Assis    schedule 26.10.2011
comment
да, это похоже на проблему. прежде чем вы сможете вызвать функцию из JS в вашем SWF, необходимо создать экземпляр SWF И его метод кодового блока ExternalInterface.addCallback должен быть выполнен. если вы хотите вызвать метод JS, как только он станет доступен, вы можете запустить метод из Flash в JS, как только addCallback будет выполнен внутри вашего SWF, поскольку DOM является открытой игрой, с которой Flash может взаимодействовать до тех пор, пока allowScriptAccess включен в Embed - person gthmb; 27.10.2011
comment
Это проблема, спасибо, Марсело, теперь дело в том, что этот метод заключается в том, чтобы загрузить URL-адрес файла .mp3, который я хочу воспроизвести (это аудиоплеер). Я пробовал просто использовать flashvars, работает нормально, но если я играю один файл, когда я иду воспроизвести следующий, он просто получает проигрыватель из кеша и воспроизводит первый файл, который я воспроизвел, отсюда и вызов ExternalInterface. Итак, у вас есть идея, на моем сайте есть поток голосовых заметок, и всякий раз, когда я нажимаю, чтобы воспроизвести одну, для нее создается проигрыватель. - person 8vius; 27.10.2011
comment
@ 8vius, почему бы лучше не объяснить свою проблему? Я этого не понял. Вам просто нужно иметь метод для вызова ваших песен и их вызова через JS, используя параметр для их выбора. Предпочтительно использовать только один SWF. - person Marcelo Assis; 27.10.2011
comment
Не знаю, как лучше объяснить, но в любом случае я решил проблему с кешированным swf, добавив к URL-адресу swf-файла просто случайную строку, чтобы сделать ее уникальным URL-адресом. Еще раз спасибо. - person 8vius; 27.10.2011