Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   утечка памяти. $.post (https://javascript.ru/forum/jquery/11210-utechka-pamyati-%24-post.html)

otvernu 12.08.2010 20:11

утечка памяти. $.post
 
Добрый день. Пишу первый гаджет для боковой панели vista (то есть работа идет только в IE7 и выше), нашел утечку памяти в его простом коде

$().ready(main);


function main(){
	if ($('#left').is(':empty')) $('#preloader').show();
	$.post("http://example.com",callback);
}

function callback(data){
	$('#preloader').hide();
	var post_server = $(".table1",data).find("tr:eq("+server+")").find("td:eq(0)").find("b").text();
	var post_online = $(".table1",data).find("tr:eq("+server+")").find("td:eq(2)").text();

	$('#left').html(post_server);	
	$('#right').html(post_online);

}


setInterval(main,180000);


через несколько часов работы гаджет сжирает просто огромное количество памяти.

Гуру, помогите советом по мере сил, а то я пока разобраться не могу. :(

Что нужно сделать, чтобы очистить все неиспользуемые объекты-переменные дабы при каждой итерации память не накапливалась?

subzey 14.08.2010 12:27

Вроде, причин для утечки нет. Если $.ajax убивает xhr после вызова callback, то все scope должны тихо мирно самоубиваться.

Кстати говоря, столкнулся с тем, что при активном использовании $.post firefox тоже без причины съедает всю память, так что, за темой буду следить внимательно.

Octane 14.08.2010 12:43

Как можно додуматься засунуть jQuery в гаджет рабочего стола!?

otvernu 16.08.2010 07:40

Цитата:

Сообщение от Octane
Как можно додуматься засунуть jQuery в гаджет рабочего стола!?

можно вот так:
<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>

otvernu 17.08.2010 06:53

не знаю как насчет $.post, но от ajax функций от jQuery пришлось отказаться. До сих пор не узнал как очищать память от $.post.

Делаю как показано в этой статье (без jQuery, просто голый JavaScript) - все прекрасно работает, утечек памяти нет: http://www.nik0las.ru/blog/2009/06/1...aks_at_ie.html


осталось разузнать как теперь разбирать пришедший ответ с сервера и все будет ок.


Вот такая конструкция не работает (внутри функции getServerData).
qw = $('#d1',_request.responseText).text();
			alert(qw);


при условии, что сервер отдает такой ответ:
<html>
<head>
</head>
<body>
	<div id='d1'>server</div>
	<div id='d2'>client</div>
</body>
</html


кто поможет с разбором?

Kolyaj 17.08.2010 07:56

var qw = _request.responseText;

otvernu 17.08.2010 08:46

я понимаю, что ответ сервера хранится в свойстве _request.responseText
Я могу вывести весь ответ, а как вывести его часть? Если в ответ приходит html код, в котором проставлены id-шники на определенных дивах, то можно ли извлечь информацию с определнного айдишника?



Расписываю подробнее
вот ответ сервера:
<html>
<head>
</head>
<body>
	<div id='d1'>server</div>
	<div id='d2'>client</div>
</body>
</html>

(я хочу оттуда достать строчку 'server', которая находится в div с id = ''d1")

в первом посте я публиковал функцию, использующую jQuery, которая все это легко делала (на другом ответе сервера находила нужный элемент) вот она
function callback(data){
	    $('#preloader').hide();
	    var post_server = $(".table1",data).find("tr:eq("+server+")").find("td:eq(0)").find("b").text();
	    var post_online = $(".table1",data).find("tr:eq("+server+")").find("td:eq(2)").text();
	 
	    $('#left').html(post_server);  
	    $('#right').html(post_online);
	 
	}

то есть тут ответ сервера хранится в переменной data, с помощью селекторов jQuery парсим ответ и достаем нужный элемент.


Сейчас я отказался от функции $.post (потому что из-за нее происходили адские утечки памяти) и переписал скриптик на "голом" JavaScript
Теперь ответ сервера должен обрабатываться как-то по другому.

Вот функция аналог callback'а:
function getServerData() {
    var _request = getHttpRequest();
 
    _request.onreadystatechange = function() {
        if (_request.readyState == 4 && _request.status == 200) {
            			
			alert(_request.responseText);
			
			
			count ++;
			_request = null;
        
		}
    }
    _request.open("POST", "http://test/req/server.php", true);
    _request.send(null);
}



в alert я передаю полный ответ сервера, хранящийся в _request.responseText

alert естественно выводит вот что:


как мне разобрать _request.responseText На составляющие и вывести только содержимое div'а c id = 'd1'?

надеюсь изложил свой вопрос довольно подробно, кто может помочь?

Kolyaj 17.08.2010 08:49

Если вам нужно парсить ответ сервера, так отдавайте сервером легко парсящийся ответ, JSON, например. Или ответ сервера не вы формируете?

otvernu 17.08.2010 08:53

Ответ сервера формирую не я.
Ответ сервера - просто html страничка, ну допустим какой-нить yandex.ru
Я хочу его распарсить.

Kolyaj 17.08.2010 09:01

Выдирайте содержимое body, кладите его в div, а оттуда уже DOM-методами.


Часовой пояс GMT +3, время: 09:37.