PDA

Просмотр полной версии : Проблема со слайдшоу


se7h
22.05.2010, 16:50
Есть слайдшоу, которое нормально работает на локальном компе, но упорно не хочет запускаться c первого раза на сайте, открываешь страницу - оно не запускается, если обновить (F5) все работает

Путь к картинкам берется из XML-файла, последовательность картинок случайная, только всегда в начале должна запускаться первая картинка

Прошу Вашей помощи

Архив с исходником прилагается (CS4, Actionscript 1.0/2.0)

studmar
23.05.2010, 01:49
проверял на хостинге, все работает, какой браузер, как вставляете?

rainbowrussia
23.05.2010, 02:16
Открыть не смог, в самом файле увидел только код загрузки XML, кода показа картинок не увидел. Быть может код показа запускается раньше чем срабатывает onLoad, когда массив еще пуст. По крайней мере симптомы очень похожи на это.

se7h
23.05.2010, 02:38
проверял на хостинге, все работает, какой браузер, как вставляете?

IE, Firefox, Opera
вставка с помощью SwfObject

Открыть не смог, в самом файле увидел только код загрузки XML, кода показа картинок не увидел. Быть может код показа запускается раньше чем срабатывает onLoad, когда массив еще пуст. По крайней мере симптомы очень похожи на это.

код вывода изображений

var intervalId:Number;
var showTime:Number = 5000; //Время показа слайда
var speed:Number = 5; //Скорость показа
container._alpha = 0;
var mcLoader:MovieClipLoader = new MovieClipLoader();
var loadListener:Object = new Object();
var i:Number = 0; //Счетчик
function slideShow() {
mcLoader.loadClip(images[i].path,container);//Загружаем фото
loadListener.onLoadInit = function() {
fade(container);//Плавный показ
i = random(photoCount);
if (i == 0) {
i = 1;
}
};
}
intervalId = setInterval(this, "slideShow", showTime);//Запускаем непрерывный показ
mcLoader.addListener(loadListener);
slideShow(i);//Первый запуск
function fade(mc) {
container._alpha = 0;
title_mc._alpha = 0;
mc.onEnterFrame = function() {
this._alpha += speed;
title_mc._alpha += speed;
if (this._alpha>=100) {
delete this.onEnterFrame;
}
};
}
stop();

rainbowrussia
23.05.2010, 17:58
Если я правильно понял у вас происходит следующее:
1) запрос на сервер для получения XML файла
2) запуск слайдшоу, не дожидаясь события xml onLoad, i = 0
3) как результат в первый раз (когда xml не в кеше браузера) запуск пустого слайдшоу

slideShow(i) нужно делать после того как обработали xml в событии onLoad

se7h
23.05.2010, 18:20
Если я правильно понял у вас происходит следующее:
1) запрос на сервер для получения XML файла
2) запуск слайдшоу, не дожидаясь события xml onLoad, i = 0
3) как результат в первый раз (когда xml не в кеше браузера) запуск пустого слайдшоу

slideShow(i) нужно делать после того как обработали xml в событии onLoad

код с отображением изображений осуществляется в 5 кадре, считываение же xml - в первом

udaaff
23.05.2010, 18:33
Загрузка не моментальна.

rainbowrussia
24.05.2010, 03:20
код с отображением изображений осуществляется в 5 кадре, считываение же xml - в первом

В этом и проблема - без stop() в предыдущих кадрах пятый кадр может начать воспроизводиться до того как загрузятся XML данные. Сделайте stop() в первом кадре, где грузите XML, а в обработчике onLoad в конце процедуры сделайте gotoAndStop(5), либо совместите все в одном кадре, и в конце процедуры onLoad сделайте slideShow(i).

se7h
24.05.2010, 12:57
В этом и проблема - без stop() в предыдущих кадрах пятый кадр может начать воспроизводиться до того как загрузятся XML данные. Сделайте stop() в первом кадре, где грузите XML, а в обработчике onLoad в конце процедуры сделайте gotoAndStop(5), либо совместите все в одном кадре, и в конце процедуры onLoad сделайте slideShow(i).

сделал как Вы посоветовали - результат тот же...
trace проверил нормально ли отрабатывает xml - здесь все ок, массив заполняется как надо


думаю здесь дело в картинках, которые напросто не успевают загрузиться

как можно реализовать предварительную подгрузку изображений?

rainbowrussia
24.05.2010, 19:33
У вас и так очередное изображение предварительно загружается, думаю дело не в этом. Выложите пожалуйста весь код в каждом кадре, который получился после применения совета "Сделайте stop() в первом кадре, где грузите XML, а в обработчике onLoad в конце процедуры сделайте gotoAndStop(5)". И дайте ссылку в инете, по которой у вас со второго раза только все срабатывает.

se7h
25.05.2010, 14:39
У вас и так очередное изображение предварительно загружается, думаю дело не в этом. Выложите пожалуйста весь код в каждом кадре, который получился после применения совета "Сделайте stop() в первом кадре, где грузите XML, а в обработчике onLoad в конце процедуры сделайте gotoAndStop(5)". И дайте ссылку в инете, по которой у вас со второго раза только все срабатывает.

сделал по Вашему методу со стопом в первом кадре и переходе на 5, но он не сработал при эмуляции низкоскоростного соединения во флешплеере

после я переделал код и слайдшоу стало работать даже при самой низкоскоростной передаче (Simulate Download, 14.4)

итак, код первого фрейма:
var images:Array = new Array();//Массив для хранения данных
var photoCount:Number;
myXML = new XML();
myXML.ignoreWhite = true;
myXML.load("images.xml");//Загружаем данные
myXML.onLoad = function(success) {
if (success) {
all = myXML.firstChild.childNodes;
photoCount = all.length;
for (i=0; i<photoCount; i++) {
images.push({path:all[i].attributes.path});//Заполняем массив
}
} else {
}
};

пятого:
var intervalId:Number;
var showTime:Number = 5000; //Время показа слайда
var speed:Number = 5; //Скорость показа
container._alpha = 0;
var mcLoader:MovieClipLoader = new MovieClipLoader();
var loadListener:Object = new Object();
var i:Number = 0; //Счетчик

mcLoader.addListener(loadListener);
slideShow(i); //Первый запуск

function slideShow() {
mcLoader.loadClip(images[i].path, container);//Загружаем фото

}

loadListener.onLoadComplete = function() {
fade(container); //Плавный показ
i = random(photoCount);
if (i == 0) {
i = 1;
}
intervalId = setTimeout(slideShow, showTime);
}

function fade(mc) {
container._alpha = 0;
mc.onEnterFrame = function() {
this._alpha += speed;
if (this._alpha>=100) {
delete this.onEnterFrame;
}
}
}
stop();


в локале все работает как часы, но почему-то на хосте не хочет... может дело во вставке флеша на страницу?

ссылка http://tangodance.by/gallery/

rainbowrussia
25.05.2010, 18:46
При таком коде у вас 5й кадр начнет играться раньше, чем загрузятся данные из XML, а там и photoCount не определен и images[i] тоже.

Код в первом фрейме вот такой делали?


var images:Array = new Array();//Массив для хранения данных
var photoCount:Number;
myXML = new XML();
myXML.ignoreWhite = true;
myXML.onLoad = function(success) {
if (success) {
all = myXML.firstChild.childNodes;
photoCount = all.length;
for (i=0; i<photoCount; i++) {
images.push({path:all[i].attributes.path});//Заполняем массив
}
gotoAndPlay(5);
} else {
}
};
myXML.load("images.xml");//Загружаем данные
stop();


если не работает то gotoAndPlay(5) замените на _root.gotoAndPlay(5)

Обратите внимание, я load перенес ниже определения события onLoad на всякий случай.

se7h
27.05.2010, 13:59
спасибо, перестановка помогла :drinks: