Показать сообщение отдельно
  #1 (permalink)  
Старый 31.05.2012, 21:03
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

Оптимизация скриптов
Добрый день!

Приведу пример сложности с которой столкнулся:
<a href="/"><img src="i.jpg" onload="EffectHoverImageParent(this)" /></a>

Стили:
a {width:60px;height:90px;display:block;float:left;margin:0;overflow:hidden;text-decoration:none;}
a img{position:relative;}

Скрипт ниже, делает так, чтобы при наведении на ссылку изображение уменьшается, чтобы вписаться в рамку 60х90. А когда убираем курсор со ссылки то изображение возвращается в исходное состояние (100% размер и отцентровано в блоке, что не влазит, то скрывается). Получается некий эффект зумма при наведении. Вот собственно сам скрипт (не рекомендую особо вникать в этот сумбур кода, т.к. соль вопроса не в этом):
function EffectHoverImageParent(el) {
	var iW=$(el).width();
	var iH=$(el).height();
	var iWp=$(el).parent().width();
	var iHp=$(el).parent().height();
	var iL=(iWp-iW)/2;
	var iT=(iHp-iH)/2;
	var iHh=iHp; var iWh=iHh*iW/iH; var sP='height';
	if(iWh<iWp) { iWh=iWp; iHh=iWh*iH/iW; sP='width'; }
	var iLh=(iWp-iWh)/2;
	var iTh=(iHp-iHh)/2;
	$(el).css('left',iL+'px').css('top',iT+'px').css('opacity','0.8');
	if(sP='height') {
		var oP={'opacity':'0.8','height':iH+'px','top':iT+'px','left':iL+'px'};
		var oPh={'opacity':'1.0','height':iHh+'px','top':iTh+'px','left':iLh+'px'};
	}
	else {
		var oP={'opacity':'0.8','width':iW+'px','top':iT+'px','left':iL+'px'};
		var oPh={'opacity':'1.0','width':iWh+'px','top':iTh+'px','left':iLh+'px'};
	}
	
	$(el).hover(
		function(){
			var $this = $(this);
			$this.stop().animate(oPh,150);
		},
		function(){
			var $this = $(this);
			$this.stop().animate(oP,150);
		}
	);
}

Сайт который использует данный скрипт построен на AJAX и страницы подгружаются динамически. И чем больше таких картинок отобразилось на экране, тем больше начинает тормозить браузер. Следовательно скрипт написан далеко не профессионально. Значит мне нужно понять свои ошибки и научиться писать правильно.
Теория о том, где ошибка
Думаю я неэффективно использую память ПК. На все подгруженные картинки навешивается свойство $(el).hover(...,...);, которое видимо хранится в оперативе и т.п. Видимо когда таких картинок пару сотен, то оператива не слабо заполняется, отсюда идут глюки... Нужно отказаться от hover и использовать стандартные способы навешивания функций на события?
Подскажите, в ту сторону ли я копаю, или я допустил совершенно другие ошибки? Может быть есть некий принцип написания кода, так сказать некий образец, чтобы не допускать утечек памяти ... ткните носом, что мне нужно подучить ...

Спасибо!
__________________
VPS от 175 рублей (есть скидки 15% писать в ПМ) Анализ рынка VPS серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн
Ответить с цитированием