Привет всем, сегодня я пытаюсь получить ссылку на XML-файл, переданный из кода Object Embed в мой Flash-ролик. (Без использования SWFobject). У меня есть 1 файл swf, который должен иметь возможность подключаться к 3 различным файлам XML.

Попытка 1


Ниже приведен HTML-код (я пытаюсь получить путь в формате XML):

<div class="left">
<h2>300 x 353 Green Accent Color</h2>

<script type="text/javascript">
        AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','300','height','353','src','TEN','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','TEN' ); //end AC code
</script><noscript>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="300" height="353">
  <param name="movie" value="player.swf" />
  <param name="quality" value="high" />
  <param name="XML" value="client_user.xml" />
  <embed src="T.swf" allowscriptaccess="always" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="300" height="353"></embed>
</object></noscript>

</div>


Класс документа

private var theXML:String = root.loaderInfo.parameters.xmlPath;


public function TEN():void
{
    if (stage) init();
    else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void 
{
    removeEventListener(Event.ADDED_TO_STAGE, init);

    xmlLoader.addEventListener(Event.COMPLETE, xmlCompleteHandler);
    xmlLoader.load(new URLRequest(root.loaderInfo.parameters.xmlPath));

    loader = new BulkLoader("bulky");
    loader.logLevel = BulkLoader.LOG_INFO;
    loader.addEventListener(BulkLoader.COMPLETE, onBulkLoadComplete);
    loader.addEventListener(BulkLoader.PROGRESS, onBulkLoadProgress);
    //loader.add("client.xml",{id:"xmldata"});              //<- for TESTING
    //loader.add(theXML+".xml",{id:"xmldata"}); //<- for LIVE
    loader.add(xmlPath+".xml",{id:"xmldata"}); //<- for LIVE
    loader.start();
}



Попытка 2


HTML с другим синтаксисом передачи PARAM:

<div class="right">
        <h2>520 x 477 Blue Accent Color</h2>
        <script type="text/javascript">
AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','300','height','353','src','TEN','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','TEN' ); //end AC code
</script><noscript>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="300" height="353">
  <param name="movie" value="T.swf?xmlPath=0" />
  <param name="quality" value="high" />
  <param name="xmlPath" value="520.xml" />
  <embed src="T.swf" allowscriptaccess="always" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="300" height="353"></embed>
</object></noscript>
    </div>



Попытка 3


Обновлен флэш-код:

private var theXML:String = "";

private function init(e:Event = null):void 
{
    removeEventListener(Event.ADDED_TO_STAGE, init);

    theXML = stage.loaderInfo.parameters.xmlPath;

    loader = new BulkLoader("bulky");
    loader.logLevel = BulkLoader.LOG_INFO;
    loader.addEventListener(BulkLoader.COMPLETE, onBulkLoadComplete);
    loader.addEventListener(BulkLoader.PROGRESS, onBulkLoadProgress);
    //loader.add("client_user.xml",{id:"xmldata"}); //<- for TESTING
    loader.add(theXML,{id:"xmldata"}); //<- for LIVE
    //loader.add(theXML+".xml",{id:"xmldata"}); //<- for LIVE
    loader.start();
}

Обновленный HTML-код:

<div class="right">
        <h2>520 x 477 Blue Accent Color</h2>
        <script type="text/javascript">
AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','300','height','353','src','TEN','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','T' ); //end AC code
</script><noscript>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="300" height="353">
  <param name="movie" value="T.swf?xmlPath=0.xml" />
  <param name="quality" value="high" />
  <param name="xmlPath" value="520.xml" />
  <embed src="T.swf?xmlPath=520.xml" allowscriptaccess="always" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="300" height="353"></embed>
</object></noscript>
    </div>

Прямо сейчас он не загружает XML-файл из параметра :(

1
Leon Gaban 25 Фев 2010 в 00:39

2 ответа

Лучший ответ

Взгляните на FlashVars - это стандартный способ передачи переменных через объект. теги в SWF.

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="300" height="353">
  <param name="movie" value="http://www.howdini.com/TEN/TEN.swf" />
  <param name="quality" value="high" />
  <param name="flashVars" value="theXML=client_user.xml" />
  <embed src="TEN.swf" 
         flashVars="theXML=client_user.xml"
         allowscriptaccess="always" 
         quality="high" 
         pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" 
         type="application/x-shockwave-flash" width="300" height="353">
  </embed>
</object>

Использование FlashVars таким образом или установка параметров запроса в URL-адресе SWF (TEN.SWF?theXML=client_user.xml) заполнит ваш поле loaderInfo.parameters.


Я привык к Flex (где FlashVars хранятся в application.parameters, но в AS3, думаю, вы бы использовали loaderInfo:

// constructor
public function init():void {
    theXML = this.loaderInfo.parameters.theXML;
    ...
}
3
Michael Brewer-Davis 25 Фев 2010 в 01:44
Какой правильный соответствующий Flash-код для этого метода? Я пробовал поместить переменную в тег embed, пробовал ставить после TEN.swf? XmlPath = 520.xml ничего не работает :(
 – 
Leon Gaban
25 Фев 2010 в 01:35
1
Майкл прав: loaderInfo.parameters - это объект, свойства и значения которого отражают flashvars, поэтому loaderInfo.parameters.theXML вернет client_user.xml.
 – 
matt lohkamp
25 Фев 2010 в 01:41

Да, просто используйте swfobject! В HTML

<script>
swfobject.embedSWF("your-movie.swf", "yourdivid", "width", "height", "flashverion", "path to expressIntall.swf", {flashvar:"value", flashvar2:"value"}, {flashparam:"value", flashparam2:"value"});
</script>
<div id="yourdivid">Your alternative content or download links for flash player</div>

На Flash

var var1:Type = root.loaderInfo.parameters['flashvar'];
var var2:Type = root.loaderInfo.parameters['flashvar2'];
1
Eder Lima 25 Фев 2010 в 04:18
Да, я бы полностью согласился, но мы не можем использовать JavaScript для клиента: /
 – 
Leon Gaban
25 Фев 2010 в 08:58