Просмотр полной версии : слайдер с несколькими вариантами галерей (XML)
Есть XML-слайдер (см. вложенный исходник).
Необходимо сделать так, чтобы по нажатию кнопок подгружались разные xml файлы (то есть, в зависимости от нажатой кнопки, была видна каждый раз разная галерея).
Например, нажимаем кнопку Auto ID - подгружается файл datas.xml. Нажимаем кнопку "Торговое оборудование" - подгружается файл datas1.xml.
Как это лучше реализовать?
Добавила пока следующее:
btn1.addEventListener(MouseEvent.CLICK,btn1Clicked);
btn2.addEventListener(MouseEvent.CLICK,btn2Clicked);
// btn3.addEventListener(MouseEvent.CLICK,btn3Clicked);
// btn4.addEventListener(MouseEvent.CLICK,btn4Clicked);
// btn5.addEventListener(MouseEvent.CLICK,btn5Clicked);
// btn6.addEventListener(MouseEvent.CLICK,btn6Clicked);
function btn1Clicked(e:MouseEvent):void {
loadXML("datas.xml");
}
function btn2Clicked(e:MouseEvent):void {
loadXML("datas1.xml");
}
Вроде, частично получилось, но если я уже нажала кнопку btn1, но нажатия на кнопку btn2 ни к чему не приводят... И наоборот: если я загрузила XML по второй кнопке btn2, то уже никак нельзя переключиться на первый datas.xml
strangedk
22.06.2012, 14:07
приведите код loadXML.
вероятно он единожды сохраняет загруженную XML и дальше не реагирует.
Это?
function loadXML(file:String):void{
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.load(new URLRequest(file));
xmlLoader.addEventListener(Event.COMPLETE, parseXML);
}
До меня пока не доходит, что конкретно нужно изменить...
strangedk
22.06.2012, 14:36
Ну, здесь всё хорошо. А что делает ф-ция parseXML ?
На всякий случай, копирую вместе с ф-цией loadImages:
function parseXML(e:Event):void{
xml = new XML(e.target.data);
totalImages = xml.children().length();
loadImages();
}
function loadImages():void{
for(var i:int = 0; i<totalImages; i++){
var loader:Loader = new Loader();
loader.load(new URLRequest("images/"+String(xml.children()[i].@src)));
images.push(loader);
imagesLink.push(xml.children()[i].@link);//-------------------------------------------
imagesText.push(xml.children()[i].@text);//-------------------------------------------
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onProgress);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
}
}
strangedk
22.06.2012, 14:47
как вижу у вас заполняется массив images, и они далее добавляются в отображение.
А при повторной загрузке картинки всё еще остаются, и массив всё еще со старыми данными.
ваша задача - перед каждой загрузкой удалить картинки с визуального отображения, и очистить массив.
- скажите где располагается images? (где делается addChild для его элементов)
Гм... давайте я приведу весь код целиком...
import com.greensock.*;
import com.greensock.easing.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.navigateToURL;
var xml:XML;
var images:Array = new Array();
var imagesLink:Array = new Array();//------------------------------------
var imagesText:Array = new Array();//------------------------------------
var totalImages:Number;
var nbDisplayed:Number =3;
var imagesLoaded:int = 0;
var slideTo:Number = 0;
var imageWidth = 131;
var container_mc:MovieClip = new MovieClip();
slider_mc.addChild(container_mc);
container_mc.mask = slider_mc.mask_mc;
function loadXML(file:String):void{
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.load(new URLRequest(file));
xmlLoader.addEventListener(Event.COMPLETE, parseXML);
}
function parseXML(e:Event):void{
xml = new XML(e.target.data);
totalImages = xml.children().length();
loadImages();
}
function loadImages():void{
for(var i:int = 0; i<totalImages; i++){
var loader:Loader = new Loader();
loader.load(new URLRequest("images/"+String(xml.children()[i].@src)));
images.push(loader);
imagesLink.push(xml.children()[i].@link);//-------------------------------------------
imagesText.push(xml.children()[i].@text);//-------------------------------------------
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onProgress);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
}
}
function onProgress(e:ProgressEvent):void{
loading_txt.text = "Loading " + imagesLoaded + " / " + totalImages;
}
function onComplete(e:Event):void{
imagesLoaded++;
if(imagesLoaded == totalImages){
loading_txt.text = "";
createImages();
}
}
function createImages():void{
for(var i:int = 0; i < images.length; i++){
var bm:Bitmap = new Bitmap();
var holder:MovieClip=new MovieClip(); //------------------------------------
bm = Bitmap(images[i].content);
bm.smoothing = true;
holder.y= i*imageWidth;//------------
holder.addChild(bm);//--------------
//bm.y = i*imageWidth;
//var currTxt:imText=new imText();
//currTxt.txt.text=imagesText[i];
//currTxt.y=50;
//holder.addChild(currTxt);
holder.addEventListener(MouseEvent.CLICK,goSite);
holder.id=i;
container_mc.addChild(holder); //--------------------------
}
}
function goSite(e:MouseEvent) {
var mc:MovieClip=MovieClip(e.target);
navigateToURL(new URLRequest(imagesLink[mc.id]));
}
previous_btn.addEventListener(MouseEvent.CLICK,slideLeft);
next_btn.addEventListener(MouseEvent.CLICK,slideRight);
function slideLeft(e:MouseEvent):void{
slideTo -= nbDisplayed;
slideContainer();
}
function slideRight(e:MouseEvent):void{
slideTo += nbDisplayed;
slideContainer();
}
function slideContainer():void{
if(totalImages - slideTo < nbDisplayed)
slideTo = totalImages - nbDisplayed;
if(slideTo < 0)
slideTo = 0;
TweenLite.to(container_mc,.5,{y:-slideTo*imageWidth,ease:Quad.easeIn});
}
//-------------------------------------------------------------------------
//private function setUpListeners():void {
btn1.addEventListener(MouseEvent.CLICK,btn1Clicked);
btn2.addEventListener(MouseEvent.CLICK,btn2Clicked);
// btn3.addEventListener(MouseEvent.CLICK,btn3Clicked);
//btn4.addEventListener(MouseEvent.CLICK,btn4Clicked);
//btn5.addEventListener(MouseEvent.CLICK,btn5Clicked);
// btn6.addEventListener(MouseEvent.CLICK,btn6Clicked);
//}
function btn1Clicked(e:MouseEvent):void {
loadXML("datas.xml");
}
function btn2Clicked(e:MouseEvent):void {
loadXML("datas1.xml");
}
Может, можно каким-либо образом просто добавить функцию отмены предыдущего клика/загрузки xml в конце, где function btnClicked?
strangedk
22.06.2012, 15:15
в ф-ции createImages в самом начале пропишите:
while (container_mc.numChildren) {
container_mc.removeChildAt(0);
}
а в ф-ции loadImages в самом начале строку:
images = null;
Сделала, получила
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at FlowerMenu/loadImages()
at FlowerMenu/parseXML()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
strangedk
22.06.2012, 15:51
сорри. Мой фейл.
images = null;
images = new Array();
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.