Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.04.2015, 04:13
Аспирант
Отправить личное сообщение для CraftLawrence Посмотреть профиль Найти все сообщения от CraftLawrence
 
Регистрация: 22.11.2014
Сообщений: 44

Скрипт бесконечно загружает ОЗУ
Доброго времени суток.
По чуть-чуть изучаю JS по ходу работы, вот столкнулся с проблемой. Мой код при выполнении бесконечно грузит ОЗУ. Он работает, через секунд 15 заканчиваются все предписанные мною анимации, и все, он должен просто остановиться, но нет..
За 10 минут простоя процесс хрома весит уже 2Гб. Понимаю, что косяк у меня крайне грубый и мне уже за него стыдно, но найти его не могу.

Код прилагается. Постарался в комментариях немного пояснить, что я там хотел сделать. Если коротко, он поочередно на странице "вытаскивает" элементы из display: none, и с помощью Opacity от 0 до 1 постепенно их "проявляет". Потом для некоторых из них идет смена положения и все, он должен остановиться..

Вроде все позакрывал с помощью "return false;"..
И пробовал спасти ситуацию Try catch'ами (а вдруг) - они тут бессильны т.к. я использую setInterval и setTimeout.

function moveTo(element, target) { // функция перемещения объекта до позиции какого-то элемента
    var targetOffset = target.offset();
    element.animate({
        top: targetOffset.top + 142,
        left: targetOffset.left + 142
    }, 1000);
    return false;
}


function animate() { // можно сказать, моя главная функция, с нее все начинается
	var scr_h = document.body.clientHeight;
	document.getElementById('body').style.backgroundSize = "1366px " + scr_h + "px";	
	opacityplus(document.getElementById('firsttitle'), 20);
	/*document.getElementById('test').innerHTML = "done!";*/
	return false;
}
setTimeout(animate, 700); // запуск ее через 0,7с

function opacityplus(element, speed){ // постепенное появление элемента
	document.getElementById('firsttitle').style.display = "block";
    setInterval(function(){
        if(+element.style.opacity>0.99||!element.style.opacity){
        	opacityminus(document.getElementById('firsttitle'), 20);
            return false;
        }
        element.style.opacity = +element.style.opacity + 0.01;
    }, speed);
}
function opacityminus(element, speed){ // потом этот элемент постепенно пропадает
    setInterval(function(){
        if(+element.style.opacity<0.01||!element.style.opacity){
        	document.getElementById('firsttitle').style.display = "none";
        	setTimeout(foropacityplus, 500);  	
            return false;
        }
        element.style.opacity = +element.style.opacity - 0.01;
    }, speed);
}
function foropacityplus(){ // функция для задержки перед появлением второго элемента
	opacityplus1(document.getElementById('singleicon1'), 300);
	return false;
}
function opacityplus1(element, speed){ // постепенное появление второго элемента
	document.getElementById('singleicon1').style.display = "block";
    setInterval(function(){
        if(+element.style.opacity>0.99||!element.style.opacity){
        	setTimeout(foropacityplus2, 1000);     	
            return false;
        }
        element.style.opacity = +element.style.opacity + 0.01;
    }, speed);
}
function foropacityplus2(){ //тут я двигаю второй элемент и перехожу к третьему
	moveTo($('#singleicon1'), $('#target1'));
	setTimeout(foropacityplus22, 1000);
	return false; 
}
function foropacityplus22(){ // снова функция для задержки
	opacityplus2(document.getElementById('singleicon2'), 300);
	return false;
}
function opacityplus2(element, speed){ // и снова постепенное появление третьего элемента
	document.getElementById('singleicon2').style.display = "block";
    setInterval(function(){
        if(+element.style.opacity>0.99||!element.style.opacity){        	
        	setTimeout(foropacityplus3, 1000);
            return false;
        }
        element.style.opacity = +element.style.opacity + 0.01;
    }, speed)
}
function foropacityplus3(){ // тут я снова двигаю третий элемент
	moveTo($('#singleicon2'), $('#target2'));
	
	return false;
}
Ответить с цитированием
  #2 (permalink)  
Старый 09.04.2015, 11:30
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

setInterval не останавливается
когда условие становится верным (+element.style.opacity>0.99||!element.style.opaci ty )
происходит вызовopacityminus(который запускает новый setInterval который запускает opacityminus( и.т.д. и.т.п.
и каждый вызов setInterval количество вызовов удваивается.

Последний раз редактировалось MallSerg, 09.04.2015 в 11:32.
Ответить с цитированием
  #3 (permalink)  
Старый 09.04.2015, 12:07
Аспирант
Отправить личное сообщение для CraftLawrence Посмотреть профиль Найти все сообщения от CraftLawrence
 
Регистрация: 22.11.2014
Сообщений: 44

Сообщение от MallSerg Посмотреть сообщение
setInterval не останавливается
когда условие становится верным (+element.style.opacity>0.99||!element.style.opaci ty )
происходит вызовopacityminus(который запускает новый setInterval который запускает opacityminus( и.т.д. и.т.п.
и каждый вызов setInterval количество вызовов удваивается.
Так и думал.
А как остановить setInterval? Clearinterval поможет? Если да, то как и где это повставлять? Перед return false внутри if?
Ответить с цитированием
  #4 (permalink)  
Старый 09.04.2015, 16:07
Аспирант
Отправить личное сообщение для CraftLawrence Посмотреть профиль Найти все сообщения от CraftLawrence
 
Регистрация: 22.11.2014
Сообщений: 44

Вопрос решил.
Clearinterval нужно запускать с if внутри этого самого интервала, и все работает.
Ответить с цитированием
  #5 (permalink)  
Старый 10.04.2015, 17:07
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от CraftLawrence
а 10 минут простоя процесс хрома весит уже 2Гб.
А когда ошибку исправите, то получите фору в час-полтора, только и всего. Хром все равно зохавает эти 2 гига если ему крутить картинками перед мордой в порядке var img = new Image(); Он же долбоящер - все кеширует.
Ответить с цитированием
  #6 (permalink)  
Старый 10.04.2015, 17:17
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Посмотрел коды. Это не так делается. Для fade используется css transition и парочка img

img_onload=function(){
			p_load.style.display='none';
			if(p_img_top.classList.contains('opacity100'))
				p_img_bot.src=this.src;
			else
				p_img_top.src=this.src;
			p_img_top.classList.toggle('opacity100');
			p_img_bot.classList.toggle('opacity100');
		},


Этот кусок для произвольных размеров img в произвольном контейнере. Для фиксированного размера анимируется только верхний img.

и для подвижек - аналогично. Потому что подвижки вручную, то есть через style.left например, идут через layout, и медленно, а через css - быстрее.

Последний раз редактировалось kostyanet, 10.04.2015 в 17:21.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PHP/AJAX скрипт "Нaселение мoегo гoрoдa oнлaйн" rustik-yes Работа 2 01.12.2014 22:53
2 компьютера 1 хром и 1 скрипт Megatron13 Opera, Safari и др. 1 21.07.2013 19:12
Почему скрипт не работает с данными, которые вернул другой скрипт? Rooner jQuery 3 20.09.2012 14:56
Изменить скрипт Изучаю_JS Общие вопросы Javascript 0 12.02.2012 22:05
А как зделать скрипт, чтобы например скрипт 1 заменялся скриптом 2? yura371 Общие вопросы Javascript 3 06.01.2009 22:40