во-вторых, у меня для одного gif-файла обработчик срабатывал 1 раз, т.е. он вызывается когда весь gif загружен, а не для каждого кадраУвидишь, что при загрузке первого кадра, сработает функция и т.д. для каждого кадра...
function clk(id){
var i=document.getElementById(id);
if(i.style.display=='none')
i.src=id+'.gif', i.style.display=''; // обрати внимание сюда
else i.style.display='none';
}
А, что, может быть у меня действительно не работает в FF3 (какой-то Minefield 3.0a7pre)может у тебя gif'ы какие-то особые
Я это знаю. Но когда вес страницы под 1 Мб, то пока она загрузится пользователь может нажать на кнопку воспроизведения анимации, которая еще не загрузилась - получится косякЯ вообще не понимаю в чем смысл такого лоадера, зачем картинки загружать последовательно? Ты не знаешь что броузер может скачивать в несколько потоков? А своим лоадером, ты только тормозишь процесс загрузки.
Можешь подробнее в этом месте, пожалуйста...во-первых лучше назначать обработчик до установки src, у меня в opera он не срабатывал, пока я не поменял местами img.src = ... и img.onload = ...
img=new Image();
img.src='...';
Avenus, твой скрипт загружает изображения последовательную, браузер же может загружать несколько изображений параллельноЯ вообще не понимаю в чем смысл такого лоадера, зачем картинки загружать последовательно?
они не загрузяться, потому что ты запускаешь загрузку следующей картинки после того, как загрузилась предыдущая (посмотри свой последний вариант)И если даже другими потоками уже зарузились другие картинки, то как только прелоадер дойдет до них, ждать не будет, а сразу быстро перейдет к следующей...
лучше писать так:Можешь подробнее в этом месте, пожалуйста...
img.onload = function() {...}
img.src = ...
img.src = ...
//потому что к этому моменту картинка может быть
//уже загружена (есть в кэше, например)
img.onload = function() {...}
C этим разобрался, снес его, поставил нормальный FF3... все работаетнасколько я понял, minefield - это alpha-версия firefox
С удовольствием бы сделал, но я не пойму как применить это к нескольким картинкам в предзагрузке на странице.зачем использовать complete c setTimeout, если можно точно узнать, когда картинка загружена, с помощью callback'а
А какой смысл проверять а альфа-версии? Если уже давно есть стабильный релиз 3.0.10?FF3 (какой-то Minefield 3.0a7pre)
В моем случае, на одной странице получается...Что касается загрузки, то обычно gif картинки довольно маленькие
Точно так же как и к одной, у каждой картинки своё событие onload.С удовольствием бы сделал, но я не пойму как применить это к нескольким картинкам в предзагрузке на странице.
Это уже аномалия какая-то, какой смысл таких гифок, видео в гифках показывать?28 анимированных GIF весом по 150 кб каждая
Красивая анимация... не видео, конечно...Это уже аномалия какая-то, какой смысл таких гифок, видео в гифках показывать?
Как? Просто выполнить функцию?... почему-то не всегда срабатывает...почему не запустить предзагрузку сразу.
покажи код, который не всегда срабатываетКак? Просто выполнить функцию?... почему-то не всегда срабатывает...
<script type='text/javascript'>
var f={
id:'i1,i2',
src:'i1.gif,i2.gif',
pl:'50,50'}; /* pl - процент для примитивного прогресс бара */
var pre=new Array();
var cpl=0; /* процент загрузки */
/* Создание кэша изображений */
function preLoad(){
var id=f.id.split(',');
var src=f.src.split(',');
for(i=0;i<id.length;i++){
pre[i]=new Image();
pre[i].src=src[i];
}
chLoad(0); /* запуск прелоадера
с проверкой на загрузку первого изображения
и поочередно остальные. Понимаю, что плохо...
Вот, хотелось бы сделать лучше */
}
/* Прелоадер и примитивный прогресс бар */
function chLoad(i){
var id=f.id.split(',');
var src=f.src.split(',');
var pl=f.pl.split(',');
if(i<id.length){
if(pre[i].complete){
cpl+=parseInt(pl[i]); /* увеличил процент загрузки */
document.getElementById('cpl').style.width=cpl+'px'; /* показал процент загрузки */
pre[i].src='';
i++;
setTimeout('chLoad('+i+')',10);
}
else{
setTimeout('chLoad('+i+')',10);
}
}
else window.setTimeout(function(){
document.getElementById('cpl').style.display='none';
document.getElementById('btn').style.display='block';
},1000);
}
/* Включение и выключение показа анимации */
function show(id){
if(document.getElementById(id).style.display=='none'){
document.getElementById(id).src='';
document.getElementById(id).src=id+'.gif';
document.getElementById(id).style.display='';
}
else document.getElementById(id).style.display='none';
}
/* Запускаю прелоад */
preLoad();
</script>
<!-- Примитивный прогресс бар -->
<div style='background:#c00;width:0px;height:10px;' id='cpl'></div>
<!-- Кнопки управления анимацией -->
<div id='btn' style='display:none;'>
<input onclick="show('i1');" type='button' value='i1'>
<input onclick="show('i2');" type='button' value='i1'>
</div>
<!-- GIF анимация, с одним циклом! -->
<img id='i1' src='i1.gif' style='display:none;'>
<img id='i2' src='i2.gif' style='display:none;'>
function chLoad(i){
var id=f.id.split(',');
var src=f.src.split(',');
var pl=f.pl.split(',');
for(i=0;i<id.length;i++){
pre[i].onload=function(){
cpl+=parseInt(pl[i]); /* увеличил процент загрузки */
document.getElementById('cpl').style.width=cpl+'px'; /* показал процент загрузки */
}
}
if(cpl<100) setTimeout('chLoad()',10);
else window.setTimeout(function(){
document.getElementById('cpl').style.display='none';
document.getElementById('btn').style.display='block';
},1000);
}
Согласен, но и не только поэтому...Подозреваю что Flash - плохо, только потому, что ты не умеешь им пользоваться
Ты пропустил слово прелоад Т.е. если чел посмотрит только 2 твоих gif'а, зачем ему прелоадом скачивать все 28?ну а 4 метра флэша? будет лучше, думаешь...
В любом, какую нажмет пользователь - для той и будет показываться своя анимация.картинки могут просматриваться в любом порядке или только по очереди?
Нет, я имею ввиду, почему не работает:насчет onload это отдельная функция
Ну тут скорее вопрос в том как её перегонял Если тупо как последовательность кадров, то конечно можно получить больший размерПопробовал вогнать во flash одну из картинок gif-анимации...
была 217кб - стала 550 кб