PDA

Просмотр полной версии : Обработка событий для подгружаемых клипов


StepanR
01.09.2009, 03:52
Делаю фотоальбом с превьюшками. Для превьюшек создаю пустые мувики-контейнеры, подгружаю в них содержимое через MovieClipLoader. Для контейнеров назначаю события - при нажатии подгружать "большую фотку".
Когда превьюшки создавал не динамически, все работало, теперь в opera и mozila события обрабатываются только если обновить страницу, когда загрузились превьюшки. Видимо связано с тем, что браузер их кэширует:o В IE работает нормально

mooncar
01.09.2009, 04:35
Как связано кэширование и сработка события? Кэширование вредит, когда обновляем содержимое, а на событийную модель влиять не должно.
Если конечно, сомневаетесь, обойдите кэширование прибавлением динамического рандомного суффикса к URL загружаемого контента... Но, ИМХО, дело не в этом.

Может быть дело обстоит так - ведь после загрузки контента контейнер теряет все свои обработчики и почти все другие программные свойства.
Если вы знаете это, то у вас обработчики должны назначаться ПОСЛЕ загрузки, в теле функции onLoadInit:
loader.onLoadInit = function (target_mc) {
//что-то делается с превьюшками, может быть размер меняете, может еще что...
target_mc.onPress = function () {
//вызов загрузки "большой фотки
};
};
Если нет, попробуйте сделать так.
Хотя, конечно, если в IE работает нормально, то странно.. но не видя вашего кода, судить тяжело.

Добавлено через 4 минуты
Возможно как раз из-за разницы в работе браузеров в одних случаях сперва назначачается обработчик, а потом подгружается картинка и обработчик убивается. В других - картинка успевает загрузиться до назначения обработчика. Если у вас сделано не как я привел выше, то повдение как раз будет таким.

StepanR
02.09.2009, 01:52
Спасибо, действительно поставил потом действия в onLoadInit и они начали обрабатываться. Проблема в том, что я не понимаю, какв теле onLoadInit прописать действия для других объектов = так что бы большая картинка подгружалась не в тот мувик, в котром создаются превьюшки.
Я делаю вот так -
в onLoadInit вставляю
target_mc.onRelease = function() {View(c_name, _parent._parent.w_);};
где View такая:
var View:Function = function (container_name:String, w_:MovieClip) {


w_[container_name] = createEmptyMovieClip(container_name, getNextHighestDepth());
w_.mcLoader = new MovieClipLoader();
w_.myListener = new Object();
w_.myListener.onLoadStart = function(target_mc:MovieClip) {
var loadProgress:Object = my_mcl.getProgress(target_mc);
};
w_.myListener.onLoadProgress = function(target_mc:MovieClip, loadedBytes:Number, totalBytes:Number) {
};
w_.myListener.onLoadComplete = function(target_mc:MovieClip) {
var loadProgress:Object = my_mcl.getProgress(target_mc);
};

w_.myListener.onLoadError = function(mcTarget:MovieClip, sErrorCode:String):Void
{
if(rr != 1){
if (sErrorCode == "URLNotFound");
{

}}
else {if (sErrorCode == "LoadNeverCompleted")
{
trace("ERROR: Load failed.");
}
else {
trace("Load error: " + sErrorCode);
}
}
};

w_.myListener.onLoadInit = function(target_mc:MovieClip, name_of_slides:String) {
var w = target_mc._width;
var h = target_mc._height;
if ((target_mc._height/target_mc._width)<(_parent.maska._height/_parent.maska._width)) {
target_mc._height = _parent.maska._height;
target_mc._width = target_mc._width*_parent.maska._height/h;
};
if ((target_mc._height/target_mc._width)>(_parent.maska._height/_parent.maska._width)) {
target_mc._width = _parent.maska._width;
target_mc._height = target_mc._height*_parent.maska._width/w;
};
target_mc._x = Math.round((_parent.maska._width/2)-(target_mc._width/2));
target_mc._y = Math.round((_parent.maska._height/2)-(target_mc._height/2));


};


w_.myListener.onLoadError = function(target_mc:MovieClip, errorCode:String) {
};
w_.mcLoader.addListener(myListener);
var n = "photos/patterns/"+ _parent._parent._name +"/"+ nn + ".jpg";
w_.mcLoader.loadClip(n,this[container_name]);
};
в общем я не знаю, как загружать большую картинку в клип w_, видимо не очень логично запихивать его в аргумент..

mooncar
02.09.2009, 02:32
Код - в теги... При всем желании вам помочь - в этой каше ничего не увидеть...
Скобки разнесите по отступам сообразно вложенности блоков. ..иначе логика останется понятной только вам...Вставьте пробелы около операторов.
Это ужас какой-то просто:
{

}}
Иначе вам никто не сможет/не захочет ничем помочь..

StepanR
02.09.2009, 02:50
Попробую привести в нормальный вид, но вообще
когда я прописываю View на временной шкале _w и выполняю функцию там же, оно работает, хотелось бы понять просто, как перенести эту функцию в onLoadInit, т.е. как правильно написать эти несколько строк
var View:Function = function (container_name:String, w_:MovieClip) {


w_[container_name] = createEmptyMovieClip(container_name, getNextHighestDepth());
w_.mcLoader = new MovieClipLoader();
w_.myListener = new Object();
//etc...
//далее стандартные действия - загрузка картинки, выравнивание ее, установка размера...
}

в общем надо ли передавать в функцию клип, в котром создается контейнер для картинки или его можно изменять прямо из функции, указав к нему путь и правильно ли писать так
w_.mcLoader

Добавлено через 10 минут
var View:Function = function (container_name:String, w_:MovieClip) {
w_[container_name] = createEmptyMovieClip(container_name, getNextHighestDepth());
w_.mcLoader = new MovieClipLoader();
w_.myListener = new Object();
w_.myListener.onLoadStart = function(target_mc:MovieClip) {
var loadProgress:Object = my_mcl.getProgress(target_mc);
};
w_.myListener.onLoadProgress = function(target_mc:MovieClip, loadedBytes:Number, totalBytes:Number) {
};
w_.myListener.onLoadComplete = function(target_mc:MovieClip) {
var loadProgress:Object = my_mcl.getProgress(target_mc);
};

w_.myListener.onLoadError = function(mcTarget:MovieClip, sErrorCode:String):Void{
};

w_.myListener.onLoadInit = function(target_mc:MovieClip, name_of_slides:String) {
var w = target_mc._width;
var h = target_mc._height;
if ((target_mc._height/target_mc._width) < (_parent.maska._height/_parent.maska._width)) {
target_mc._height = _parent.maska._height;
target_mc._width = target_mc._width*_parent.maska._height/h;
};
if ((target_mc._height/target_mc._width) > (_parent.maska._height/_parent.maska._width)) {
target_mc._width = _parent.maska._width;
target_mc._height = target_mc._height*_parent.maska._width/w;
};
target_mc._x = Math.round((_parent.maska._width/2) - (target_mc._width/2));
target_mc._y = Math.round((_parent.maska._height/2) - (target_mc._height/2));
};
w_.myListener.onLoadError = function(target_mc:MovieClip, errorCode:String) {
};
w_.mcLoader.addListener(myListener);
var n = "photos/patterns/" + _parent._parent._name + "/" + nn + ".jpg";
w_.mcLoader.loadClip(n,this[container_name]);
};
как-то так

mooncar
02.09.2009, 04:03
1. Вам не нужно создавать всякий раз экземпляр MovieClipLoader и слушателя. Достаточно одного комплекта. В вашей функции View оставьте только создание контейнера и саму загрузку.
2. Уберите из нее вообще всё. Все обработчики. Вытащите их наружу. Достаточно тоже только одного комплекта. Зачем вам плодить мусор? Пусть функция выполняет у вас только уникальные задачи (см. п.1). Класс MovieClipLoader со своими обработчиками разберется, что и куда вы загрузили.
3. Внутри функции обработчика можно безбоязненно ссылаться на родителський мувик: target_mc._parent Это будет ссылка, а не "передача" внутрь. Вы же не передаете куда-то весь таймлайн, когда ссылаетесь на _root...
Еще что-то может быть можно подумать, но не сейчас...

StepanR
02.09.2009, 16:55
Большое спасибо! все заработало!

Добавлено через 6 часов 29 минут
позвольте еще вопрос! при нажатии кнопки создаю здесь контейнер
trace(container_name);
_parent._parent._parent.w_.createEmptyMovieClip(container_name, getNextHighestDepth());
mcLoader.loadClip(n, _parent._parent._parent.w_[container_name]);

идея в том что бы при нажатии на кнопку-превьюшку новая картинка загружалась, а старая не выгружалась (что бы человеку не приходилось смотреть окно загрузки или пустое место).

однако такое впечатление, что картинка каждый раз грузится в одно и то же место, замещая предыдущую
хотя container_name меняется

Добавлено через 56 часов 18 минут
если что, проблема решена

bear84
19.05.2010, 14:15
это жесть
mcLoader.loadClip(n, _parent._parent._parent.w_[container_name]);