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-методами.

otvernu 17.08.2010 09:10

_request.responseText.getElementById('d1')


почему-то не работает.

Kolyaj 17.08.2010 09:31

Вы первые два действия в моём последнем предложении пропустили.

otvernu 17.08.2010 11:10

а использовать селекторы jQuery
для _request.responseText возможно каким либо образом?

Gvozd 17.08.2010 11:12

Цитата:

Сообщение от otvernu
а использовать селекторы jQuery

вы все еще не прочитали два очень важных действия из сообщения Kolyaj

otvernu 17.08.2010 11:45

Цитата:

Сообщение от Gvozd (Сообщение 67644)
вы все еще не прочитали два очень важных действия из сообщения Kolyaj

я их прочитал, но пока еще не применил на практике.:) Сейчас пока собираю информацию в перерывах между основной деятельностью.
Осталось поместить в оберточку "<div></div>" ответ сервера и все будет чики-поки.

В общем, всем спасибо за ответы, я так понимаю, что все встало на свои места.

Gvozd 17.08.2010 11:56

Цитата:

Сообщение от otvernu
я их прочитал, но пока еще не применил на практике.

ну, и почему же вы задаете воросы на которые ужде дан ответ, и вы его не опробовали?
тем более, что ваш ворос выглядит так, как будто вы не прочитали ответ Kolyaj

otvernu 17.08.2010 12:40

Цитата:

Сообщение от Gvozd (Сообщение 67657)
ну, и почему же вы задаете воросы на которые ужде дан ответ, и вы его не опробовали?
тем более, что ваш ворос выглядит так, как будто вы не прочитали ответ Kolyaj

а разве нельзя предположить, что мне не показалось, что на мой вопрос уже был дан ответ? Тем более, что по моему мнению, мои последние два вопроса никак не похожи друг на друг и тем более ваш вопрос выглядит так, как будто вы не прочитали мой последний пост, а именно вот эту его часть
Цитата:

Сообщение от otvernu
пока собираю информацию в перерывах между основной деятельностью

До сих пор не понимаете?
Давайте я выстрою логическую цепочку за вас.
Итак судите сами - вначале я спрашиваю о возможности селектинга вообще, а потом о возможности применения методов jQuery. Для меня первый тезис не является достаточным для положительного ответа на мой вопрос о применении jQuery, поэтому я его и задаю.
А ну да, и вот вам еще пара аргументов:

otvernu - новичек на форуме, сообщений 10, регистрация 12.08.2010

Gvozd - Матрос, сообщений 3,821 , регистрация 03.04.2008

Могу в вашем стиле задать такой встречный вопрос:
Gvozd, а почему вы задаете мне вопрос, если я ясно дал понять, что данная тема форума меня уже не интересует?

Это такой "тонкий" троллинг на техническом форуме или чо?


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