@jezzit

Как устранить утечку памяти в Chrome?

В Opera всё работает прекрасно, в Chrome постоянно выдаёт "Опаньки" и сообщение о недостатке памяти.
Уважаемые знатоки jquery и javascript. Я не прошу вас разбирать код по строчке, а прошу лишь бегло просмотреть код и указать на грубые ошибки, которые могут присутствовать в моём нагромождении кода (вроде вложенности getJSON друг в друга, или еще чего..) Заранее спасибо!
draggableMap: function() {
        var $map = $('#image-container'),
            $parent = $('.flats-wrapper'),
            $build = $('.building', $map),
            $schemePopup = $('#scheme-popup');
		var $part1 = $schemePopup.find('.part1'),
			$part2 = $schemePopup.find('.part2'),
			$part3 = $schemePopup.find('.part3');
		var	$preTab = $('.pre-tab', $schemePopup),
			$t_head = $('.t_head', $part2);
        if ( !(/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)) ) {
            var constrainArray = function(){
                var wDiff = $map.width() - $parent.width();
                var hDiff = $map.height() - $parent.height();
                return [-hDiff, 0, 0, -wDiff]
            };
            var pepCall = function() {
                $map.pep({
                    constrainTo: constrainArray()
                });
            };
            pepCall();
            $(window).on('resize', function () {
                constrainArray();
                $.pep.unbind($map);
                pepCall();
            });
        } else {
            $parent.css('overflow', 'auto');
        }
		
		//Клик на здании
        $build.on('click', function(event) {
			event.preventDefault();
            var $thisBuild = $(this);
            $schemePopup.fadeIn(200);
            $thisBuild.addClass('active');
			//получаем данные json для конкретного дома
			//и запускает .part1 с параметрами из файла
			var $buildInfo = new Object();
			$buildInfo.numberBuild = $thisBuild.attr('class').split(' ');
			$buildInfo.numberBuild = $buildInfo.numberBuild[1];

			$.getJSON('json/houses.json', function(data) {
				var obj= data[$buildInfo.numberBuild];
				$buildInfo.name 			= 	obj.name,
				$buildInfo.count_sections 	= 	obj.count_sections,
				$buildInfo.count_floors 	= 	obj.count_floors,
				$buildInfo.count_apps 		= 	obj.count_apps,
				$buildInfo.count_1_apps 	= 	obj.count_1_apps,
				$buildInfo.count_2_apps 	= 	obj.count_2_apps,
				$buildInfo.count_3_apps 	= 	obj.count_3_apps,
				$buildInfo.count_4_apps 	= 	obj.count_4_apps,
				$buildInfo.end_date 		= 	obj.end_date,
				$buildInfo.type 			= 	obj.type;
			
				//Если не указано количество квартир, считаем, что информации по дому ещё нет.
				if ($buildInfo.count_apps=='' || $buildInfo.count_apps=='0') {
					$part1.hide();
					$part2.hide();					
					$part3.show();
					return false;
                } else {
					$part1.show();
					$part2.hide();
					$part3.hide();
				}
				
				//Планировки отображаются в зависимости от типа
				$t_head.data("type", $buildInfo.type);
				
				//Заполняем part1 инфой по домам
				$('#bld-name', $part1).html($buildInfo.name);
				$('.showplans', $part2).html($buildInfo.name);
				p = $('#build-info', $part1).find('p span');
				p.eq(0).html($buildInfo.count_sections);
				p.eq(1).html($buildInfo.count_floors);
				p.eq(2).html($buildInfo.count_apps);
				p.eq(3).html($buildInfo.end_date);
				
				li = $('#build-info', $part1).find('li span');
				li.eq(0).html($buildInfo.count_1_apps);
				li.eq(1).html($buildInfo.count_2_apps);
				li.eq(2).html($buildInfo.count_3_apps);
				
				//Показываем вкладки с планировками в зависимости от данных
				$preTab.css('display', 'inline-block');
				$preTab.css('width', '25%');
				if($buildInfo.count_4_apps == '0') {
					$preTab.eq(3).css('display', 'none');
					$preTab.eq(7).css('display', 'none');
					$preTab.css('width', '33%');
				}
				if($buildInfo.count_3_apps == '0') {
					$preTab.eq(2).css('display', 'none');
					$preTab.eq(6).css('display', 'none');
					$preTab.css('width', '50%');
				}
				if($buildInfo.count_2_apps == '0') {
					$preTab.eq(1).css('display', 'none');
					$preTab.eq(5).css('display', 'none');
					$preTab.css('width', '100%');
				}
				//Удаляем прежний owlCarousel
				var $flats_slider = $('.flats-slider')
				
				if ($flats_slider.hasClass("owl-carousel")) {
					$flats_slider.each(function() {
						$(this).empty();
						$(this).data('owlCarousel').destroy();
					});
				}				
				//Заполняем планировки---------------------------------
				switch ($buildInfo.type) {
					case 'CUBE':
						$flats_slider.eq(0).html(	'<a href="img/planes/CUBE/1/1.png"><img src="img/planes/mini/CUBE/1/1.png"></a>'+
													'<a href="img/planes/CUBE/1/2.png"><img src="img/planes/mini/CUBE/1/2.png"></a>'+
													'<a href="img/planes/CUBE/1/3.png"><img src="img/planes/mini/CUBE/1/3.png"></a>'+
													'<a href="img/planes/CUBE/1/4.png"><img src="img/planes/mini/CUBE/1/4.png"></a>');
						$flats_slider.eq(1).html(	'<a href="img/planes/CUBE/2/1.png"><img src="img/planes/mini/CUBE/2/1.png"></a>'+
													'<a href="img/planes/CUBE/2/2.png"><img src="img/planes/mini/CUBE/2/2.png"></a>'+
													'<a href="img/planes/CUBE/2/3.png"><img src="img/planes/mini/CUBE/2/3.png"></a>'+
													'<a href="img/planes/CUBE/2/4.png"><img src="img/planes/mini/CUBE/2/4.png"></a>');
						$flats_slider.eq(2).html(	'<a href="img/planes/CUBE/3/1.png"><img src="img/planes/mini/CUBE/3/1.png"></a>'+
													'<a href="img/planes/CUBE/3/2.png"><img src="img/planes/mini/CUBE/3/2.png"></a>');
						break;                      
					case 'WALL':                    
						$flats_slider.eq(0).html(	'<a href="img/planes/WALL/1/1.png"><img src="img/planes/mini/WALL/1/1.png"></a>'+
													'<a href="img/planes/WALL/1/2.png"><img src="img/planes/mini/WALL/1/2.png"></a>'+
													'<a href="img/planes/WALL/1/3.png"><img src="img/planes/mini/WALL/1/3.png"></a>'+
													'<a href="img/planes/WALL/1/4.png"><img src="img/planes/mini/WALL/1/4.png"></a>');
						$flats_slider.eq(1).html(	'<a href="img/planes/WALL/2/1.png"><img src="img/planes/mini/WALL/2/1.png"></a>'+
													'<a href="img/planes/WALL/2/2.png"><img src="img/planes/mini/WALL/2/2.png"></a>'+
													'<a href="img/planes/WALL/2/3.png"><img src="img/planes/mini/WALL/2/3.png"></a>'+
													'<a href="img/planes/WALL/2/4.png"><img src="img/planes/mini/WALL/2/4.png"></a>'+
													'<a href="img/planes/WALL/2/5.png"><img src="img/planes/mini/WALL/2/5.png"></a>'+
													'<a href="img/planes/WALL/2/6.png"><img src="img/planes/mini/WALL/2/6.png"></a>');
						break;
				}
				//Открываем apps.json для получения информации о планировках
				$.getJSON('img/planes/'+$buildInfo.type+'/apps.json', function(AppsData) {
					//Прикручиваем magnificPopup
					$flats_slider.each(function(index) {
						var $h2room;
						switch (index) {
							case 0:	$h2room = "Однокомнатная"; break;
							case 1:	$h2room = "Двухкомнатная"; break;
							case 2:	$h2room = "Трехкомнатная"; break;
							case 3:	$h2room = "Четырехкомнатная"; break;							
						}
						$(this).magnificPopup({
							delegate: 'a', 
							type: 'image',
							gallery: {
								enabled: true,
								navigateByImgClick: true,
								arrowMarkup: '<button type="button" class="mfp-arrow mfp-arrow-%dir% fa fa-angle-%dir%"></button>'
							},
							image: {
								markup: '<div id="flats-content" class="mfp-figure">'+
										  '<div class="mfp-close"></div>'+
										  '<div class="iblock">'+
												'<div class="mfp-img"></div>'+
											'</div>'+
											'<div class="iblock">'+
												'<p class="pp-flat-head">'+
													'<h1>Дом '+$buildInfo.name+'</h1>'+
													'<h2>'+$h2room+' квартира <span></span></h2>'+
												'</p>'+
												'<p id="gen_area">Общая площадь: <span>15,45</span> м<sup>2</sup></p>'+
												'<p id="area_w_b">Площадь без лоджии: <span>13,4</span> м<sup>2</sup></p>'+
												'<p id="liv_area">Жилая площадь площадь: <span>8,68</span> м<sup>2</sup></p>'+
												'<button id="button-mini" class="yellow-button mini">Оставить заявку</button>'+
												'<p class="feedbackpls" style="display:none;">Эта кнопка пока не доступна.</p>'+
												'<p class="feedbackpls" style="display:none;">Чтобы отправить заявку, воспользуйтесь, пожалуйста, формой внизу сайта.</p>'+
												'<form id="mini-form" style="display:none;">'+
												'<input type="text" placeholder="Ваше имя"/>'+
												'<input type="tel" placeholder="Ваш телефон"/>'+
												'<button id="submit" class="yellow-button mini">Отправить</button>'+
												'<p id="mini-form-status"></p>'+
												'</form>'+
											'</div>'+								  
										'</div>'		
							},
							overflowY: 'scroll',
							callbacks: {
								markupParse: function(template, values, item) {
									var $splitsrc = item.src.split('/');
									$index_plane = $splitsrc[4].split('.')[0];//Номер планировки
									$count_room = $splitsrc[3]; //Количество комнат

									$('h2 span',template).html(' №' + $index_plane);
									var im = AppsData[$count_room+'_room'][$index_plane];

									$('#gen_area span',template).text(im.gen_area);
									$('#area_w_b span',template).text(im.area_w_b);
									$('#liv_area span',template).text(im.liv_area);
								}
							}
						});
					});
					//Прикручиваем owlCarousel для добавленных элементов
					$flats_slider.owlCarousel({
						loop: true,
						margin: 30,
						items: 4,
						autoWidth: true
					});
				});
			});
			return false;
        });
		//Клик на планировки
		$('a.pre-tab').on('click', function() {
			//Переключение вкладки
			$('.t_head > div', $part2).eq($(this).index()).trigger('click');
			$part1.hide();			
			$part2.show();
			return false;
		});	
    },
  • Вопрос задан
  • 455 просмотров
Пригласить эксперта
Ответы на вопрос 2
@vGrabko99
html, css, js, php, golang, mysql
вот уж извольте. Но от такого кода глаза слезятся..
Ответ написан
AlexXYZ
@AlexXYZ
O Keep Clear O
Если не вникая в бизнеслогику - суммировать много строк операцией "+" - не очень хорошая идея. Я как-то "подглядел" что происходит в памяти через профайлер при многоцикловых и многострочных сложениях - каждая операция "+" создаёт в памяти отдельную строку, т.е. "а"+"b"+"c", то в памяти будут две строки "ab" и "abc". Поэтому при больших строковых сложениях я использую ["a", "b", "c"].join(""). Тогда на выходе будет реальная контакенация в одну строку. И да, этот прикол у меня случился тоже в chrome, но после такой оптимизации и другие браузеры заработали быстрее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы