mrhard
@mrhard
web разработчик

Почему jQuery.getScript с использованием setInterval приводит к зависанию страницы?

Есть необходимость указывать на странице статусы пользователей online/offline



Решил каждые десять секунд подгружать скрипт, генерированный PHP с информацией о статусе всех пользователей.



Через некоторое время, открытая страница виснет намертво(



Использовал вместо getScript load — аналогично.



function loadmessages(){<br>
<br>
            $.getScript('/load.js');<br>
                     <br>
            <br>
        }<br>
        $(document).ready(function()	{<br>
            loadmessages();<br>
        	setInterval('loadmessages()',10000);<br>
        				})<br>
      <br>
<br>




На стороне /load.js через PHP идет выдача скрипта:



$(".user_1").addClass('online');<br>
 $(".user_2").addClass('online');<br>
 $(".user_3").removeClass('online');<br>
  • Вопрос задан
  • 3669 просмотров
Решения вопроса 1
@egorinsk
А вы используете средства разработчика (FireBug/Chrome Inspector) или расширения браузера? попробуйте отключить всю эту гадость, ситуация должна улучшиться.

Например, фаерфоксовский фаербаг и хромовский инспектор известны своими зависаниями и адским потреблением ресурсов (памяти) на сложных страницах. Фаербаг еще и течет (не осовобождает занятую память) при этом.

Ну и конечно, кроме этого, задачу вы решаете абсолютно криворуко и неправильно. Для этой задачи не нужны ни getScript (который фактически добавляет к странице элемет script), ни тем более воркеры (которые не будут работать в ИЕ). Надо просто делать обычный $.ajax(), а результат отдавать в виде JSON, и все у вас заработает.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Для таких вещей лучше использовать воркеры. тогда ситуации с зависанием страницы быть не должно. По сути Web Workers и создавались для подобных задач.

В вашем случае я рекомендую проверить где именно вешается страница. Если на этапе получения данных — то реализуйте их через $.ajax и выставьте timeout скажем в 1000.

И лучше сделайте так, что бы сервер возвращал json вида {online:true}. А потом уже в коллбэке делайте что хотите.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
>>которые не будут работать в ИЕ
В ссылке что я привел имплементация кроссбраузерна. Работает конечно не все, но для этих целей сгодится.
Ответ написан
pxx
@pxx
Про использование JSON верно написали. Можно еще поглядеть в сторону COMET, но там будет несколько посложнее, доведется еще сервер конфигурировать под это.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы