доступ к динамически загружаемому видеоролику (этап> область прокрутки> myloader> movieclip)

#flash #actionscript-3 #actionscript #loader #movieclip

#flash #actionscript-3 #actionscript #загрузчик #movieclip

Вопрос:

то, что я пытаюсь сделать, это получить доступ

    snapText = scrollPane.source.textSnapshot;
  

из внешнего swf-файла. Я пробовал:

   trace("-->: " scrollPane.source.textSnapshot.getText(0, 1000));
  trace("-->: " myLoader.content.textSnapshot.getText(0, 1000));
  trace("-->: " mc.textSnapshot.getText(0, 1000));
  trace("-->: " mc.getChildAt(0).textSnapshot.getText(0, 1000));
  trace("-->: " mc.getChildByName(myLoader).textSnapshot.getText(0, 1000) );
  trace("-->: " scrollPane.content.textSnapshot.getText(0, 100));
  

все это было бесполезно. Кстати:

   mc.getChildAt(0).textSnapshot.getText(0, 1000)
  

выдает ошибку:

   1119: Access of possibly undefined property textSnapshot through a reference with static type flash.display:DisplayObject.
  

хотя я знаю, что метод существует.

весь приведенный выше код выполняется в функции checkHandler:

  myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, checkHandler);
  

таким образом, swf-файл должен был быть полностью загружен.
Текст тоже есть, я проверил с помощью swf-декомпилятора.
видеоролик с загрузчиком создается следующим образом

  scrollPane = MovieClip(root).scrollPaneOnStage;
 myLoader.load(new URLRequest("tmp1.swf"));
 mc.addChild(myLoader);
 scrollPane.source = mc;
  

заранее спасибо!

ОБНОВЛЕНИЕ — все еще не решено

Теперь я получаю доступ к swf, как указал HotN.

   function checkHandler(evt:Event):void {

         libMC  = evt.target.content as MovieClip;
         libMC.gotoAndStop(0); 
          trace(libMC.textSnapshot.getText(0, 100));
         snapText = libMC.textSnapshot;
        scrollPane.source = mc;
    }
  

Сначала это привело к ошибке, поскольку загрузчик в сценарии as3 не может загрузить фильм as2 (т. Е. AVM1). итак, я создал swf-файл AVM2, который привел к ошибке: ошибка# 2000: нет активного контекста безопасности.В качестве решения я использовал класс из http://www.igorcosta.org/?p=231 чтобы загрузить swf-файл, но по-прежнему не могу получить доступ к textSnapshot:

   trace(libMC.textSnapshot.getText(0, 100));
  

ничего не возвращает и не выдает ошибку!

Кстати: хотя я мог бы изменить формат swf, я не могу изменить сам файл, поскольку он генерируется автоматически.

Ответ №1:

Чтобы ссылаться на что-либо в загруженном swf-файле, вам нужно просмотреть содержимое загрузчика, который вы использовали для загрузки swf-файла. Это даст вам эту ссылку:

 function checkHandler(e:Event):void {
    var loadedSWF:Object = e.target.content;
}
  

Перейдя loadedSWF , вы можете получить доступ к содержимому swf-файла, предполагая, что они настроены на общедоступность.

Комментарии:

1. итак, мне потребовалось некоторое время, чтобы отчитаться. теперь я попытался получить доступ к swf-файлу по-своему, что кажется шагом в правильном направлении. кроме того, я обнаружил, что загрузчик в скрипте as3 не может загрузить фильм as2 (т. Е. AVM1). итак, я создал swf-файл AVM2 , который привел к ошибке: ошибка# 2000: нет активного контекста безопасности. Поэтому я использовал пользовательский класс отсюда igorcosta.org/?p=231 чтобы загрузить swf, но я все еще не могу получить доступ к textSnapshot.

Ответ №2:

Используете ли вы механизм TLF (текстовые поля TLF)? Механизм Flash CS5 TLF вызывает некоторые ошибки при загрузке SWF-файлов и попытке получить доступ к свойствам или методам этих загруженных SWF-файлов. Вы можете прочитать все об этом в этом сообщении в блоге Стивена Сакса .

Если это так, решение довольно простое: измените текстовые поля TLF на обычные (они помечены как классический текст, на панели свойств текстового поля есть селектор), и (надеюсь) все будет работать нормально, без дальнейших изменений кода.

Если вам нужны тексты TLF и вы не можете обойтись обычными, вы можете найти пару решений (больше похожих на обходные пути, но неважно) в этом Adobe Technote.

Надеюсь, это поможет!

Комментарии:

1. очень хороший ввод, большое спасибо. однако входной swf-файл не использует механизм tlf.

Ответ №3:

Так что это заняло у меня слишком много времени, но я разобрался.

       //... {

        loader = new Loader();  
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, checkHandler);
        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
        var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); 
        context.checkPolicyFile = false;
        loader.load(new URLRequest("tmp1.swf"), context);


      //..... }

      function checkHandler(evt:Event):void {

        loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,checkHandler);

        libMC  = loader.content as MovieClip;

                    //works now!
            libMC.textSnapshot.getText(100, 200);

        scrollPane.source = libMC;


    }
  

итак, хитрость заключалась в использовании стандартной функции загрузчика, как предлагалось так много раз. однако flash каким-то образом изменяет настройки безопасности / изолированной среды на моем локальном компьютере, что привело к ошибке # 2000: нет активного контекста безопасности. однако при загрузке на удаленный сервер он по-прежнему работал нормально, что странно. вы можете установить для локальных настроек воспроизведения значение «доступ только к локальным файлам» в меню «Файл»> «Настройки публикации», но в моем случае это совсем не помогло…