Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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 серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн
Ответить с цитированием
  #2 (permalink)  
Старый 01.06.2012, 00:01
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

greatilya,
Вообще т для картинок лучше использовать готовые галлереи, подгружающих динамически полномасштабную картинку, одна из неплохих отечественных => Iload => http://studioad.ru/index/0-8
Ответить с цитированием
  #3 (permalink)  
Старый 01.06.2012, 00:40
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от greatilya
И чем больше таких картинок отобразилось на экране, тем больше начинает тормозить браузер. Следовательно скрипт написан далеко не профессионально. Значит мне нужно понять свои ошибки и научиться писать правильно.
какая логическая цепочка к сожалению, она не полностью верна - многий говнокод может работать нормально. он немного другие отличия от совершенного имеет.

Сообщение от greatilya
Нужно отказаться от hover и использовать стандартные способы навешивания функций на события?
да. а точнее, использовать "делегирование событий", который в jquery представлен функцией live.
Ответить с цитированием
  #4 (permalink)  
Старый 01.06.2012, 05:41
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

Deff,
я не старался изобрести lightbox, а части моего коды были подсмотрены из готового зуммера, но его функционал несколько отличался от моих задач.


melky,
понятно, спасибо! а вот меня тут только всё терзает вопрос, например у нас есть такое (пример взят по предложенной вами ссылке):
<div id="content">
  <ul id="menu">
    <li><a class="button" href="/php">PHP</a></li>
    <li><a class="button" href="/html">HTML</a></li>
    <li><a class="button" href="/javascript">JavaScript</a></li>
    <li><a class="button" href="/flash">Flash</a></li>
  </ul>
</div>
<script type="text/javascript">
document.getElementById('menu').onclick = function(e) {
  var target = e && e.target || event.srcElement; // целевой элемент
  if (target.tagName != 'A') return; // если не ссылка - не интересует!
  var href = target.getAttribute('href');
  alert(href); // обработать клик по элементу
  return false; // отменить переход по ссылке
}
function nextPage() {
document.getElementById("content").innerHTML="новый контент";
}
</script>

Тут у нас событие было делегировано при загрузке страницы. А если мы потом запускаем nextPage(), то всё что было делегировано на menu очищается? или так и остается висеть в памяти?
__________________
VPS от 175 рублей (есть скидки 15% писать в ПМ) Анализ рынка VPS серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн
Ответить с цитированием
  #5 (permalink)  
Старый 01.06.2012, 09:56
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от greatilya
Тут у нас событие было делегировано при загрузке страницы. А если мы потом запускаем nextPage(), то всё что было делегировано на menu очищается? или так и остается висеть в памяти?
должно очищаться - благодаря сборщику мусора в JS.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическая загрузка скриптов dolas Events/DOM/Window 6 08.03.2013 06:07
Оптимизация кода. Правила хорошего тона при написании скриптов [ANTI]CheateR jQuery 1 18.09.2010 08:41
Динамическая подзагрузка и исполнение скриптов NT Man Javascript под браузер 2 28.08.2009 12:32
Оптимизация скриптов object Ваши сайты и скрипты 9 21.07.2008 13:58
Паралельная загрузка чужих скриптов? GOll Общие вопросы Javascript 2 10.07.2008 22:39