Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2016, 21:09   #1
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию Помогите найти утечку памяти

Здравствуйте. Есть страница обновляемая по таймеру раз в секунду, на странице таблица, в каждой строке понадобилось сделать выпадающее меню, нашёл в сети скрипт менюшки (сам я не кодил на JS до этого) всё бы хорошо, да каждую секунду браузер сжирает по 100-200кб оперативы, медленно но верно, соответственно через какое то время начинает жутко тормозить, налицо явная утечка памяти.

Код:
<script type="text/javascript">
   $(document).ready(function () {

    function hideallDropdowns() {
        $(".dropped .drop-menu-main-sub").hide();
        $(".dropped").removeClass('dropped');
        $(".dropped .drop-menu-main-sub .title").unbind("click");
        
        if (document.getElementById('autorefresh').checked)
         reloadTimer();
    }

    function showDropdown(el) {
       if (typeof timer !=="undefined") 
         clearInterval(timer);
        
        var el_li = $(el).parent().addClass('dropped');
        el_li
            .find('.title')
            .click(function () {
                hideallDropdowns();
            })
            .html($(el).html());

        el_li.find('.drop-menu-main-sub').show();
    }

    $(".drop-down").click(function(){
        showDropdown(this);
    });

    $(document).mouseup(function () {
        hideallDropdowns();
    });
  });
 </script>
Когда убираю этот скрипт со страницы память перестаёт расходоваться, но соотвественно и менюшки не работают. Полазив по сети пришёл только к выводу что надо прописать события onclick явно. Может знающие люди подскажут как поправить скрипт дабы избежать утечек ?

P.S. Что касается остановки и запуска таймера, это я уже дописал, что бы останавливать таймер на время показа меню, иначе оно просто закрывалось при обновлении таблицы)

Последний раз редактировалось Adult_Master; 08.08.2016 в 21:17.
Adult_Master вне форума Ответить с цитированием
Старый 08.08.2016, 22:53   #2
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Ну ты ведь не весь код показал. Здесь есть вещи, которые могли бы вызвать незначительные проблемы + версия jQ старая вроде как, вроде до 1.7 где-то (в новых версиях юзают метод .off() для анбайнда события).
В теле таймере скорей всего трабла, а его как раз нет.
UPD еще работа с dom через innerHTML относительно затратна, в этом тоже может копаться проблема.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 08.08.2016, 23:04   #3
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию

Код:
<script type="text/javascript">   
  var timer; 
  function reloadTimer() {
   clearInterval(timer);
   timer = setInterval('show()', 1000);
  }
 </script> 

 <script type="text/javascript"> 
   function show()
    { 
     $.ajax({  
     url: "<?=base_url()?>/terminals/terminalslist",  
     cache: false,  
     success: function(html){  
     $("#display").html(html);  
      }  
     }); 
    }
    
     show();
     
     $(document).ready(function(){   
     if (localStorage.getItem('autorefresh') == "true") {
      document.getElementById('autorefresh').setAttribute('checked','checked');
     }
      
     reloadTimer();
    });   
 </script>
Вот код таймера, и вывода обновляемого блока с таблицей.
autorefresh - это чекбокс на странице, позволяющий отключать автообновление. В localStorage сохраняю его состояние, что бы при переходе на другую страницу и возврате на эту его состояние сохранялось. Ещё раз повторюсь, весь код собирал сам по кускам и примерам из и-нета, с JS до этого не работал ни разу.

Дальше идёт код заполнения таблицы с помощью foreach, если нужно могу и его выложить, но я пробовал вовсе убирать таблицу - утечки есть. Т.е. дело явно не в таблице.

Версия JS - jquery-3.1.0.min.js

Последний раз редактировалось Adult_Master; 08.08.2016 в 23:09.
Adult_Master вне форума Ответить с цитированием
Старый 08.08.2016, 23:20   #4
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию

Пока постил ответ самому пришла идея:
вот на этой странице я вызываю $(document).ready(function(), насколько я понял это событие окончательной загрузки страницы, в нем запускается таймер, по которому в блок подгружается вторая страница с таблицей, дело в том что в ней тоже есть событие $(document).ready(function(), может просто при каждой сработке таймера таймер пересоздаётся заново, а т.к. переменная var timer; глобальная она и не высвобождается после отработки функции reloadTimer ?
P.S. В других ЯП я и сам стараюсь избегать глобальных переменных, но тут не придумал ничего лучше что бы управлять таймером из других функций.

Последний раз редактировалось Adult_Master; 08.08.2016 в 23:24.
Adult_Master вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти утечку garuna Общие вопросы Delphi 4 14.01.2016 05:56
Задача-найти объем оперативной памяти по шестнадцатеричному адресу последнего байта оперативной памяти Ksana Alex Помощь студентам 4 14.11.2013 15:51
Задача - найти объём памяти, который требуется для хранения изображения Александр95 Помощь студентам 5 13.10.2011 20:17
Найти и исправить ошибку. (Ссылки, указатели, утечка памяти) С,С++ ZanLeO Общие вопросы C/C++ 8 09.08.2010 13:00