Acuna
@Acuna
Заполнил свой профиль

Почему $.ajax () постепенно зависает?

Приветствую всех!

Клепаю проект в свободное от работы время, но недавно совершенно неожиданно для себя столкнулся со странной проблемой. Ее суть заключается в следующем: на каждой странице сайта имеются ссылки, при переходе по которым контент грузится в определенный блок на сайте аяксом. То есть к ним на onclick подвешен метод с аяксом. Таких ссылок достаточно много, то есть юзеры будут щелкать много и уверенно) Сам код особо ничем не примечателен:

$.ajax ({
	
	method: 'get',
	url: 'ajax.php',
	cache: true,
	data: { mod:mod, id:id, },
	success: function (c) {
		$('#content').html (c);
	},
	
	}).done (function () {
		return false;
	});
	
});


Все работает отлично, но я уже начал готовиться выкинуть его в продакшн, поэтому решил пощелкать все более основательно и с ужасом обнаружил, что с каждым кликом по таким ссылкам контент грузится все более медленно. 3-4 ссылки летают, с 5 наблюдаются уже секундные затыки, а далее браузер (любой) просто люто виснет на минуту. После того, как он отходит, при следующем клике картина повторяется. Помогает только перезагрузка страницы (если, конечно, браузер в данную минуту не висит))) ). Такое ощущение, что он что-то там грузит в кеш, который постепенно переполняется, или пишет что-то в какой-то стек. Скорее всего лучшим решением будет что-то очищать после каждого вызова аякса, вот только что и от чего?)
Уже и кэш аякса включал/отключал, c async игрался, кидал рандомный параметр в url - ничего не помогает. Проц при этом не грузит, память не жрет.

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

Буду благодарен любой помощи, так как меня уже холодок пробирает: занимался проектом два года, а из-за такой мелочи работа с ним почти невозможна...

Заранее благодарен!
  • Вопрос задан
  • 3851 просмотр
Решения вопроса 1
@vdem
Возможно, в jQuery где-то вешаются live обработчики событий? И каждый раз, когда в #content загружается очередной html, эти обработчики добавляются к элементам в #content. И после очередного $('#content').html(c) эти обработчики продолжают где-то висеть. Впрочем, не уверен.

P.S. А еще, я бы не стал вот так писать: { mod:mod, id:id, }. 1) Бывали необъяснимые глюки с похожей записью, пока не поменял на { 'mod':mod, 'id':id, }, 2) Там есть лишняя запятая, старые версии IE выбрасывали ошибку: { 'mod': mod, 'id': id }
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@sl1m_dogg
$.ajax ({
				
				method: 'get',
				url: 'ajax.php',
                               cache: true,
				data: { mod:mod, id:id, },
				success: function (c) {
					$('#content').html (c);								
				},
			
			}).done (function () {
				return false;
			});


а вообще хотелось бы посмотреть как зависает
Ответ написан
AMar4enko
@AMar4enko
В хроме же прекрасные инструменты профилирования.
Запустите запись событий, пощелкайте ваши ссылки и посмотрите, что именно жрет процессорное время. Чай не 2000 год.
Ответ написан
it_proger29
@it_proger29
Битрикс
В моем случае зависания были из-за:
async: false,
После изменений зависания ушли.
function showMyCart(){
    $.ajax({
        async: true,
        type: "POST", 
        url: url_serv+"cart.php", 
        dataType: "text",
        data:{
            'action': 'show',
        },
        error:function(){
            $('#view-cart').html('Ошибка');  
        },           
        beforeSend: function() { 
            $('#view-cart').html('Загрузка');  
        },                
        success: function (result) {  
            $('#view-cart').html(result);    
            $('#view-cart').removeClass('load--after');    
        }
    });
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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