2015-12-17 4 views
0

РЕШЕНИЕ: Я должен был добавить более подробную информацию. Несмотря на то, что внешний интерфейс был настроен, объекты NetConnection/NetStream не были подключены к серверу. В результате я не мог звонить. Очень важная деталь, которую я забыл, извинения.Передача JS при внешнем внешнем интерфейсе AS

Я знаю, что правильно иметь Flash-вызов JavaScript, когда внешний интерфейс готов, поэтому я делаю вызов. Метод JS вызван правильно, но я не могу выполнить успешный вызов обратно в файл Flash. Я должен вручную установить 1-секундный тайм-аут, чтобы заставить его работать, и я не понимаю, почему. Если внешний интерфейс готов, я должен сразу же перезвонить Flash, да?

Кстати, я использую SWFObject.embedSWF(), чтобы разместить файл Flash на странице. Я дал файлу атрибуты id и name.

Вот мой флэш-код:

private function init():void // onCreationComplete handler 
    { 
     this.setupExternalInterface(); 
    } 

    private function setupExternalInterface():void 
    { 
     if (ExternalInterface.available) 
     { 
      ExternalInterface.call("swfIsReady"); 
      ExternalInterface.addCallback("call", makeACall); 
     } 
    } 

А вот страница JSP:

function swfIsReady(){ 
     setTimeout(flexCall,1000); 
    } 

    function flexCall(){ 
     var theApp = getFlexApp(attributes.name); 
     theApp.call(); 
    } 

    function getFlexApp(appName) 
    { 
     if (navigator.appName.indexOf ("Microsoft") !=-1) 
     { 
      return window[appName]; 
     } 
     else 
     { 
      return document[appName]; 
     } 
    } 

Это единственный способ, которым это работает. Я думал, что могу просто удалить таймаут и сразу вызвать flexCall().

+0

Что произойдет, если вы переверните две строки, где вы выполняете 'ExternalInterface.call()' и 'ExternalInterface.addCallback()'. Сначала добавьте обратный вызов, затем скажите Javascript, что внешний интерфейс готов ... это может не помочь, просто вслух ... –

+0

К сожалению, это не сработало. Но спасибо. – fumeng

ответ

1

Я думаю, что у вас есть две небольшие проблемы в вашем коде:

  • Первая проблема с использованием метода call(), который используется в JavaScript для invoke a function.

Попробуйте это (я не уверен, что это работает, но более увидеть проблему):

swf_obj.call.call(); 

но решение просто использовать другое имя функции обратного вызова:

swf_obj.make_call(); 
  • Второй, вызывает ExternalInterface.addCallback() после ExternalInterface.call(), который вы можете просто отменить свой заказ, чтобы заставить его работать.

Так что ваш код может быть, как это, например:

ActionScript:

private function init(event:FlexEvent):void 
{ 
    setupExternalInterface(); 
} 
private function setupExternalInterface():void 
{ 
    if (ExternalInterface.available) 
    { 
     ExternalInterface.addCallback("make_call", makeACall);    
     ExternalInterface.call("swfIsReady");          
    } 
} 

JavaScript:

function swfIsReady() 
{ 
    var swf_obj= swfobject.getObjectById(attributes.name); 
    if (swf_obj) { 
     swf_obj.make_call(); 
    } 
} 

Надежда, которая может помочь.

+0

Большое спасибо за помощь. Во-первых, .call() был только мной, используя псевдокод. Фактический метод не был назван так и да, теперь я знаю, что .call() создает новый объект в JS.Реальная проблема заключалась в том, что я возвращался на страницу JSP, когда был настроен внешний интерфейс, и не ожидал, что соединение с сервером будет установлено. Вот почему он терпел неудачу. Мне нужно было дождаться, когда NetStream будет подключен, прежде чем я смогу начать звонить. Извиняюсь, я должен был быть намного яснее. – fumeng

+0

@fumeng Нет проблем. Но, как вы знаете, мы отвечаем на вопрос в соответствии с тем, что мы видим и ничего не понимаем;) – akmozo

+0

Согласен, и хороший момент. Я отмечу это как принятый ответ. – fumeng