Проблема с загрузкой при использовании в интервале

0

У меня есть приложение php, где я.load() обширный контент каждые 2 минуты в div. Браузер (я должен его создать для IE8) обычно начинает замедляться через несколько минут после перезагрузки данных. Я уже знаю причину - память не избавляется от загруженных ранее данных, пока загружается сама страница.

Есть ли способ сделать это, чтобы память не заливалась после нескольких/много перезагрузок?

Я нашел это:

jQuery load() метод утечки памяти?

и прохладный ответ на него здесь (см. полный поток qaru.site/questions/69100/...):

Это не полный ответ, но я быстро нашел, как исправить весь мой код с минимальными изменениями. В моем "базовом" классе js (это объект, который используется на каждой странице для стандартных кнопочных подключений по имени класса и т.д.). Я добавил следующий метод, который выполняет проверку для обработчиков dupe:

    BindOnce: function(triggerName, fn) {
    function handlerExists(triggerName, theHandler) {
        function getFunctionName(fn) {
            var rgx = /^function\s+([^\(\s]+)/
            var matches = rgx.exec(fn.toString());
            return matches ? matches[1] : "(anonymous)"
        }
        exists = false;
        var handlerName = getFunctionName(theHandler);
        if ($(document).data('events') !== undefined) {
            var event = $(document).data('events')[triggerName];
            if (event !== undefined) {
                $.each(event, function(i, handler) {
                    if (getFunctionName(handler) == handlerName) {
                        exists = true;
                    }
                });
            }
        }
        return exists;
    }
    if (!handlerExists(triggerName, fn)) {
        $(document).bind(triggerName, fn);
    }
}

Тогда я просто вызываю его вместо метода bind!

Но я не могу заставить это работать (когда я переписываю простой рабочий.bind() fn, он перестает работать). Есть ли способ достичь этого по-другому?

Или кто-нибудь может помочь мне со сценарием, который я написал? Ничего, когда я назначаю его кнопке. Я использую функцию:

$('#myButtonID').BindOnce("click", function() {
  alert( "User clicked on 'foo.'" );
});

который работает для простого.bind()

РЕДАКТИРОВАТЬ

heres оригинальный.load(), который убивает меня.

<script type="text/javascript">
var skill = <?php echo json_encode($skill_, JSON_UNESCAPED_UNICODE); ?>;
var skill_final = <?php echo json_encode($skill_final, JSON_UNESCAPED_UNICODE); ?>;
var camp_final = <?php echo json_encode($camp_final, JSON_UNESCAPED_UNICODE); ?>;
var jmeno = <?php echo json_encode($jmeno_, JSON_UNESCAPED_UNICODE); ?>;
var pozice = <?php echo json_encode($pozice_, JSON_UNESCAPED_UNICODE); ?>; 
var delka = <?php echo json_encode($delka_, JSON_UNESCAPED_UNICODE); ?>;
var opravneni = <?php echo json_encode($opravneni, JSON_UNESCAPED_UNICODE); ?>;

$(document).ready(function(){
  refreshPrehled();
});
function refreshPrehled(){
  $('#checkboxes').load('load_prehled.php', {
    skill: skill,
    skill_final: skill_final,
    camp_final: camp_final,
    jmeno: jmeno,
    pozice: pozice,
    delka: delka,
    opravneni: opravneni
  }, function(){
    setInterval(refreshPrehled, 120000);
  });
}
</script>
  • 0
    Reloading предполагает, что вы загружаете одни и те же данные несколько раз. Разве вы не можете отслеживать на сервере то, что уже загружено, и только отправлять новые / измененные вещи?
  • 0
    @jeroen У меня есть скрипт, который переписывает несколько .txt с обновленными данными каждые 2 минуты и на этом основании я реструктурирую таблицу.
Показать ещё 4 комментария
Теги:

1 ответ

2
Лучший ответ

Вы повторно создаете setInterval при каждом вызове функции, вместо этого вы должны использовать setTimeout. Используя ваш текущий код, первый вызов функции отправит один ajax-запрос, затем после 120000ms он будет выполнен дважды, затем через 120000ms будет выполняться 4 раза и т.д. using setTimeout вместо этого останавливается, потому что он только выполняет функцию один раз.

$(document).ready(function(){
    refreshPrehled();
});
function refreshPrehled(){
    $('#checkboxes').load('load_prehled.php', {
        skill: skill,
        skill_final: skill_final,
        camp_final: camp_final,
        jmeno: jmeno,
        pozice: pozice,
        delka: delka,
        opravneni: opravneni
    }, function(){
        setTimeout(refreshPrehled, 120000);
    });
}
  • 0
    А с setTimeout он не заливает память? Или все равно замедлиться после 30 перезагрузок?
  • 0
    Теоретически этого не произойдет, в зависимости от того, что load_prehled.php вернет, конечно. Протестируйте его с меньшей задержкой, скажем, 10 секунд, и оставьте его на час, следя за памятью.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню