Просмотр полной версии : как подрузить картинки в цикле через loadClip()???
MashaViv
17.01.2007, 17:57
Всем привет!!!!
у меня вознилка вот такая проблема.
Мне надо загрузить несколько картинок причем какие именно картинки поределяется динамически и урл берутся из БД.
Я пыталсь сделать так: загрузила все урл в масив , а потом пыталась в цикле for(){} загружать из с помощью loadClip.
Вот код:
var masLoadedObj = new Array();
var masListener = new Array();
var masData = new Array();
for(var i = 0;i<3;i++){
name_mc = "image_mc_"+i;
this.createEmptyMovieClip(name_mc,this.getNextHighestDepth());
masLoadedObj[i] = new MovieClipLoader();
masListener[i] = new Object();
masLoadedObj[i].addListener(masListener[i]);
url = "picture/"+masData[i+1];
masLoadedObj[i].loadClip(url,name_mc);
masListener[i].onLoadInit = function(target_mc:MovieClip) {
target_mc._width = 100;
target_mc._height = 100;
target_mc._x = i*10;
target_mc._y = i*10;
};
но в этом случае он выдает ошибку,что не может открыть последнюю из всех эти картинок.
Т.е если 3 картинки то он пишет что не может открыть file:////D|/direction/im(3).jpg.
если 2 картинки то он пишет что не может открыть file:////D|/direction/im(2).jpg.
а если одна картинка то все нормально.
Помогите пожалуйса!Что тут происходит????
вот я думала мож он ругается потому что не успевает загрузить одну какртинку ,то есть на срабатывает событие onLoadComplete, а цикл продолжается, и он начинает грузить другую...
Если это так, то как надо правильно все сдеалть, чтоб работало????
ПОЖАЛУЙСТА!!!!!ПОМОГИТЕ!!!
заранее СПАСИБО!!!
Что такое хорошо?
17.01.2007, 21:36
может это - про цикл и ID тебе поможет
http://flasher.ru/forum/showthread.php?t=84941
Вполне можно обойтись одним лоадером:
// список картинок, полученный из базы данных
var masData:Array = new Array("pik1.jpg","pik2.jpg","pik3.jpg","pik4.jpg");
var mcl:MovieClipLoader = new MovieClipLoader();
var ls:Object = new Object();
var name_mc:String;
var url:String;
ls.onLoadInit = function ( target_mc:MovieClip ) {
target_mc._width = 100;
target_mc._height = 100;
target_mc._y = target_mc.i * 10;
target_mc._x = target_mc.i * 10;
};
mcl.addListener( ls );
for( var i:Number = masData.length-1; i >= 0; i-- ){
name_mc = "image_mc_"+i;
this.createEmptyMovieClip( name_mc, this.getNextHighestDepth(), { i:i });
url = "picture/"+ masData[i];
mcl.loadClip(url,name_mc);
}
PS: не проверял, но должно работать.
Не стоит грузить файлы все сразу. Лучше по 1-2 штуки, дождитесь загрузки одного объекта и начинайте следующий. У браузеров количество одновременно скачиваемых файлов не так уж велико, например у ИЕ по умолчанию 2, остальные будут стоять в очереди. И если скорость инета маленькая или вес файла большой, то запрос к последнему файла может привысить время ожидания.
В таком случае так:
// список картинок, полученный из базы данных
var masData:Array = new Array("pik1.jpg","pik2.jpg","pik3.jpg","pik4.jpg");
var mcl:MovieClipLoader = new MovieClipLoader();
var ls:Object = new Object();
var name_mc:String;
var url:String;
ls.onLoadInit = function ( target_mc:MovieClip ) {
target_mc._width = 100;
target_mc._height = 100;
target_mc._y = target_mc.i * 10;
target_mc._x = target_mc.i * 10;
if(target_mc.i>0)loadNext();
};
mcl.addListener( ls );
var i:Number = masData.length-1;
function loadNext():Void{
i--;
name_mc = "image_mc_"+i;
this.createEmptyMovieClip( name_mc, this.getNextHighestDepth(), { i:i });
url = "picture/"+ masData[i];
mcl.loadClip(url,name_mc);
}
loadNext();
upd: в коде ошибка, выделено красным, см. ниже
только initObject нельзя передать в createEmptyMovieClip, к тому ж в него еще и грузим ..
не вижу почему эту же i (которую для загрузки пользуем) не использовать
ls.onLoadInit = function ( target_mc:MovieClip ) {
target_mc._width = 100;
target_mc._height = 100;
target_mc._y = i * 10;
target_mc._x =i * 100;
i--;
if(i>=0)loadNext();
};
mcl.addListener( ls );
var i:Number = masData.length-1;
function loadNext():Void{
name_mc = "image_mc_"+i;
this.createEmptyMovieClip( name_mc, this.getNextHighestDepth());
url = "picture/"+ masData[i];
mcl.loadClip(url,name_mc);
}
loadNext();
точно, я двоешник ((
с другой стороны, i нам может и пригодиться, так что можно просто назначить:
var mc:MovieClip = createEmptyMovieClip( name_mc, this.getNextHighestDepth());
mc.i = i;
url = "picture/"+ masData[i];
mcl.loadClip(url, mc);
А ты проверял, существует-ли твоя переменная после загрузки картинки, а?
MashaViv
18.01.2007, 13:46
Привет Всем!
Kikasso , я пыталась сделать так как ты посоветовал, но у меня все равно та же беда.Взяла просто и скопировала твой код(тот где с loadNext()) и запустила его.И конечно, поменять имена файлов я не забыла. Но у меня все та же ошибка появляется.
----------------------------------------------------------------------
Error opening URL "file:///D|/Masha/gallery/picture/im3.jpg"
Error opening URL "file:///D|/Masha/gallery/picture/im2.jpg"
Error opening URL "file:///D|/Masha/gallery/picture/im1.jpg"
Error opening URL "file:///D|/Masha/gallery/picture/im0.jpg"
----------------------------------------------------------------------
Но разница лишь в том что если раньше он выводил такое сообщение только на последний загружаемы файл , то теперь на все((((
Что это такое вообще не пойму((((
Вроде же все должно грузиться нормально.В чем загвоздка?????7
Подскажите пожалуйса!
спасибо)))
так а файлы где лежат и как называются??
А ты проверял, существует-ли твоя переменная после загрузки картинки, а?
упс.. Разумеется, после загрузки картинки переменная исчезнет.
берите код silin'a
Приношу извинения за дезинформацию и ухожу в монастырь.:o
загадочная какая-то история: если "Error opening URL", то как же следующая заргузка запускается, ведь onLoadInit не должен сработать ..
не говоря уже о том, что в изначальном раскладе Kikasso вообще только первая загрузка проходит..
MashaViv, ты свой код покажи, интересно же как такого можно добиться..
к слову: такая последовательная загрузка чревата тем, что все заткнется при ошибке (хотя можно и onLoadError задействовать на этот случай), если же грузить всех сразу, то недополучим только ущербные..
а насчет ограничений на одновременную загрузку у браузера, так не факт, что плагин у него разрешения спрашивает, iNils, откуда информация?
последний совет.. это работает ( под Windows )..
вот это
dir *.jpg /b >dir.txt
сохранить как dir.bat в папке с картинками и запустить.
в dir.txt получим список файлов.
Злополучная затираемая i отвечает за позиционирование, и никак не влияет на загрузку, так что корень зла не в этом. Проверил.
Тогда какой смысл в присвоении i?
как же не влияет, если if(target_mc.i>0) loadNext();
Мне остается только приложить готовое работающее решение, собраное из всего в этой ветке. Нуждается в распаковке.
работающее нам не надо, нам с 4мя 'Error opening URL' давай..
зы: я бы тож непрочь по автобану поездить хоть чуть-чуть: достали наши дороги :)
работающее нам не надо, нам с 4мя 'Error opening URL' давай..
Это просто - берешь код из моего первого поста и запускаешь. Как раз и выдаст, картинок-то нет. :victory:
Если картинки есть, он грузит все, только одну над другой :o
>>Как раз и выдаст, картинок-то нет.
без картинок я и сам могу, ты с картинками попробуй..
MashaViv
18.01.2007, 15:59
Вот пожалуйста то самы код который выдает ошибки типа
---------------------------------------------------------
Error opening URL "file:///D|/Masha/gallery/picture/im(3).jpg"
---------------------------------------------------------
this.stop();
var sender:LoadVars = new LoadVars();
var reciver:LoadVars = new LoadVars();
sender.page = bNext_mc.counter;
sender.sendAndLoad("http://test2.ru/content.php", reciver, "POST");
reciver.onData = function(mes:String):Void{
var masLoadedObj = new Array();
var masListener = new Array();
var masData = new Array();
var masUrl = new Array();
var g:Number = 0;
var j:Number = 0;
var index:Number = null;
masData = mes.split("|");
for(var g = 0;g<masData.length; g++){
index = masData[g].lastIndexOf(".jpg");
if(index!=-1){
masUrl[j] = masData[g];
j++;
};
}
//var masUrl:Array = new Array("im(0).jpg","im(1).jpg","im(2).jpg","im(3).jpg"); этот массив грузиться из базы
var mcl:MovieClipLoader = new MovieClipLoader();
var ls:Object = new Object();
var name_mc:String;
var url:String;
ls.onLoadInit = function ( target_mc:MovieClip ) {
target_mc._width = 100;
target_mc._height = 100;
target_mc._y = i * 10;
target_mc._x =i * 100;
i--;
if(i>=0)loadNext();
};
mcl.addListener( ls );
var i:Number = masUrl.length-1;
function loadNext():Void{
name_mc = "image_mc_"+i;
_root.createEmptyMovieClip( name_mc,_root.getNextHighestDepth());
url = "picture/"+ masUrl[i];
mcl.loadClip(url,name_mc);
}
loadNext();
}
я пробовало то что вы давали, оно работает естественно. А вот так нет. Может дело в том , что у меня оброботка иде в событии onData()????
MashaViv
18.01.2007, 16:26
А скажите еще пожалуйста, если ограничения на то какого размера грузить картинки в цикле???
Вот например пишу так :
this.stop();
for (var i = 0;i<_root.masUrl.length;i++){
trace(_root.masUrl[i]);
}
// список картинок, полученный из базы данных
//var masData:Array = new Array("DrinkIt.jpg", "P1050153.jpg", "P1140179_CB.jpg", "P1150418.jpg");
var masData:Array = new Array("im(0).jpg","im(1).jpg","im(2).jpg","678.jpg");
var mcl:MovieClipLoader = new MovieClipLoader();
var ls:Object = new Object();
var name_mc:String;
var url:String;
ls.onLoadComplete = function(target_mc:MovieClip) {
trace("cjom");
}
ls.onLoadInit = function ( target_mc:MovieClip ) {
//target_mc._width = 100;
//target_mc._height = 100;
//target_mc._y = i * 10;
//target_mc._x =i * 100;
i--;
trace("in");
if(i>=0)loadNext();
};
mcl.addListener( ls );
var i:Number = masData.length-1;
function loadNext():Void{
name_mc = "image_mc_"+i;
this.createEmptyMovieClip( name_mc, this.getNextHighestDepth());
url = "picture/"+masData[i];
mcl.loadClip(url,name_mc);
}
loadNext();
это кстати код который я скачала с той самой ссылки))
у меня все картинки весят гд-то по 200кило.Запускаю код.И ошибка та же самая.
---------------------------------------------------------
Error opening URL "file:///D|/Masha/gallery/picture/im(3).jpg"
---------------------------------------------------------
Теперь беру и уменьшаю катринук im(3).jpg до размеров 46,0 КБ , терь ее рзамер 100*100 . Запускаю.И....О чудо одна картинка im(3).jpg загрузилось и для остальных ошибка
---------------------------------------------------------
Error opening URL "file:///D|/Masha/gallery/picture/im(2).jpg"
---------------------------------------------------------
Тут получается дело в размере что ли?????
Ничего не понимаю(((
MashaViv
18.01.2007, 16:38
Ну я вообще не пойму что за чудеса!!!
Вот смотрите.Изначально изображение у меня веслио 200 кило и не грузилось и было ошбика
---------------------------------------------------------
Error opening URL "file:///D|/Masha/gallery/picture/im(3).jpg"
---------------------------------------------------------
я думал что картинка слоишком большая.Взяла фотошоп изменила размер до 40 кило.Все ок, все грузится.Потом взяла и увелчичило до 4метро.И гружится же.Так что такое ???? может файлы просто бачные , а я тут все гружу)))???!!!
MashaViv
18.01.2007, 16:47
Млин..... это же пипец просто какой-то!!!!!!
Дело в том , что все эти обишки возникали, потому что я использовала недопустимые имена(((((((
вот
im1.jpg допустмо!!!
im(1).jpg не допустимо!!
вот и все...
эх обидно((((
Всем огромное спасибо за помощь.!!!!
Без Вас я бы не справилась!!!!!!!!
Выручили)))
оч. похоже на то, что просто файлы битые..
тестил код из поста #22 : если от пхп приходит то, что надо, то все должно работать..
зы: reciver.onData надо бы определить до sender.sendAndLoad , хотя дело не в этом, канеш..
зыы: в локале im(1).jpg тож проходит, однако..
Поздравляю с решением проблемы ))
Все наверняка гораздо проще. В php после закрывающего "?>" остался перевод строки или пробел. Это приплюсовалось к имени последнего файла, и такого файла естественно нет. В этом был изначальный трабл.
Причем этот пробел мог быть и в другом файле, подключенном по по include.
с помощью XML картинки список картинок получать надежнее:
files.xml:
<xml>
<![CDATA[pic0.jpg]]>
<![CDATA[pic1.jpg]]>
<![CDATA[pic2.jpg]]>
<![CDATA[pic3.jpg]]>
<![CDATA[pic4.jpg]]>
<![CDATA[pic5.jpg]]>
<![CDATA[pic6.jpg]]>
<![CDATA[pic7.jpg]]>
</xml>
флеш:
var gallery_xml:XML = new XML();
gallery_xml.ignoreWhite = true;
gallery_xml.onLoad = function(success:Boolean) {
if (success && this.status == 0) {
var images:Array = this.firstChild.childNodes;
// список картинок
trace (images);
}else{
trace("ЕГГОГ");
}
//delete this;
//^^ так не работает
delete gallery_xml;
// а так работает - удаляем ненужный больше xml
}
gallery_xml.load("files.xml");
upd: подрихтовано
Kikasso, а что, простите, делает delete this?
Kikasso, а что, простите, делает delete this?
так было написано в файле gallery_tween.fla только немного по-другому:gallery_xml.onLoad = function(success:Boolean) {
try {
/* if you are able to successfully load and parse the gallery from a remote XML file,
parse out the image names and add them to an array. */
if (success) {
var images:Array = this.firstChild.childNodes;
var gallery_array:Array = new Array();
for (var i = 0; i<images.length; i++) {
gallery_array.push({src:images[i].firstChild.nodeValue});
}
/* call the displayGallery function which handles loading in each
of the gallery images and placing them on the Stage. */
displayGallery(gallery_array);
} else {
throw new Error("Unable to parse XML");
}
} catch (e_err:Error) {
trace(e_err.message);
} finally {
delete this;
}
};
файл находится по адресу
.../Flash8/Samples and Tutorials/Samples/Action Script/Galleries
Так что вопрос собственно не ко мне.
Разработчики просто поленились проверить, удаляет ли эта фраза ненужный более xml.
В таком виде - не удаляет.
В таком - //delete this;
delete gallery_xml; // да, изнутри!
удаляет, что только что проверено:
setTimeout(function (){ trace(gallery_xml);}, 2000 );
xml там выглядит так:
<?xml version="1.0"?>
<gallery>
<img><![CDATA[DCP_0730.jpg]]></img>
<img><![CDATA[DCP_0731.jpg]]></img>
<img><![CDATA[DCP_0732.jpg]]></img>
<img><![CDATA[DCP_0733.jpg]]></img>
<img><![CDATA[DCP_0734.jpg]]></img>
</gallery> где тут написано "utf-8" ?
delete gallery_xml никак не изнутри, просто повезло, что область видимости совпадает. Две секунды можно и не ждать.
А про utf-8 — нигде не написано, а должно. А кто сказал, что стандартные примеры являются самыми-самыми? delete this уже показывает то, что разработчик не в теме.
delete gallery_xml никак не изнутри, просто повезло, что область видимости совпадает. Две секунды можно и не ждать.
Почему же повезло? Так и задумывалось. Изнутри дается команда. Две секунды мне не жалко.
А по сабж, я внимательно перечитал симптомы и готов поспорить, что ошибка была именно в паразитном символе после закрывающего тега в php. Это все объясняет - почему не грузился именно последний джепег.
Пробел в текстовом поле и в output не виден, а на сервер посылается в виде %20 ( перевод строки %0A ).
А кто сказал, что стандартные примеры являются самыми-самыми? delete this уже показывает то, что разработчик не в теме.
Насчет стандартных примеров, что они самые-самые, никто не говорил.
Они просто работают-работают.
delete this - ну, захотелось человеку прибраться, отмахнулся веником.. а тут надо бумажку на палочку накалывать..
А фразу "разработчик не в теме" можно я себе в подпись возьму? C вашим (с) естественно?
Почему же повезло?
А ты сделай объявление onLoad метода в другом месте и всё, кирдык, если повезет, удалишь ссылку на XML только в конкретной области видимости, зато другая останется, а вместе с ней и XML. И GC не удалит XML как объект, на которого нет ссылок. Ты «изнутри» обращаешься наружу, вне метода. А вне метода могут быть совершенно другие объекты, переменные и т.п. А ты привязываешь четко к тому, что объект с заданным именем вне метода существует. Вовсе не факт, что существует.
з.Ы. Я про конкретную вещь в коде, не столько про проблему загрузки, сколько про логику.
з.Ы.Ы. Фразу — пожалуйста.
А ты сделай объявление onLoad метода в другом месте и всё, кирдык
Этого я делать как раз не собирался. Я помню обсуждение http://www.flasher.ru/forum/showthread.php?p=596796#post596796 и на какой изврат пришлось пойти, чтобы удалить объект методом obj.del(), и что delete только удаляет ссылку, а за самим объектом приходит сборщик мусора с косой (когда ссылок больше нет) я прекрасно знаю.
"delete this" я не писал, я это оставил, есть небольшая разница (семантическая). "изнутри" - ну, изнутри скобок.
К слову, можно и оставить именно этот XML в покое. Или объявить его локально внутри функции, возвращяющей массив с картинками.
Что разработчики не ангелы и код в примерах не эталон, тоже известно. Пример я привел для иллюстрации удобства XML в данном конкретном случае - вместо того, чтобы разбивать строку, массив можно получить автоматически. ...
var images:Array;
gallery_xml.onLoad = function(success:Boolean) {
if (success && this.status == 0) images = this.firstChild.childNodes;
}
...
массив остается и после удаления XML.
Кроме удобства, если у нас картинки выдаются по адресам вида
piks.php?i=25&message=hello&rand=123456
передать через LoadVars нереально, а через CDATA запросто.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.