jQuery, .empty () и память - PullRequest
       26

jQuery, .empty () и память

4 голосов
/ 27 мая 2010

мое приложение (ASP.NET MVC) показывает страницу, которая загружает данные постоянно, через определенные промежутки времени.

Сценарий jQuery вызывает контроллер, а этот визуализирует другое частичное представление на основе определенных условий.

Это частичное представление добавляется в DOM с помощью jQuery; предыдущие элементы удаляются методом empty ().

        $(document).ready(function() {
        var ScheduledAction = function(func, times, interval) {
            var ID = window.setInterval(function(times) {
                return function() {
                    if (times > -1) {
                        if (--times <= 0) 
                            window.clearInterval(ID);
                        }
                    func();
                }
            } (times), interval);
        };
        ScheduledAction(function() {
            LoadAppointments();
            }, -1, <%=Model.RefreshTimeout %>);
    });

    function LoadAppointments()    {

        $("#AppointmentsList").empty();
        $('#loading').html("<img src='Images/bigloader.gif' />");
        $.get(UrlAction, 
            function(data) {
                if (data != '') {
                    $('#AppointmentsList').append(data);
                    $('#loading').empty();
                   } 
                else {
                    $('#loading').fadeOut(3000, function() { $('#loading').empty(); });
                   }
            });
        }  

Контроллер (UrlAction) возвращает частичное представление. Для каждой поездки туда и обратно частичный вид отличается. После частичного просмотра содержит только изображение. В другой ситуации это div с некоторой информацией.

Я понял, что через один день браузер загружает что-то вроде 600 МБ памяти. Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 27 мая 2010

Это может быть просто ошибка в jQuery?

Я сталкивался с похожими проблемами, в основном при выполнении множества запросов AJAX с течением времени во всех версиях IE.

Эта ошибка описывает проблему и простой патч для jQuery, который должен это исправить:

http://dev.jquery.com/ticket/6242

1 голос
/ 27 мая 2010

Я считаю, что вы не ошибаетесь, а скорее реализуете JavaScript в браузере. Вы сталкиваетесь с этой проблемой в разных браузерах (Firefox, Opera, Internet Explorer) или только в каком-то конкретном браузере?

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

0 голосов
/ 27 мая 2010

Возможно, вы захотите попробовать это вместо:

[ПРАВИТЬ] удаленная функция возвращается в setInterval

$(document).ready(function() {
    $('#loading').html("<img src='Images/bigloader.gif' />").hide();
    ScheduledAction(LoadAppointments, -1, <%=Model.RefreshTimeout %>);
});

function ScheduledAction(func, times, interval) {
    var ID = window.setInterval(function() {
        if (times > -1) {
            if (--times <= 0)
                window.clearInterval(ID);
        }
        func();
    }, interval);
}

function LoadAppointments() {

    $("#AppointmentsList").empty();
    $('#loading').show();
    $.get(UrlAction,
            function(data) {
                if (data != '') {
                    $('#AppointmentsList').append(data);
                    $('#loading').hide();
                }
                else {
                    $('#loading').fadeOut(3000);
                }
            });
}

Я заметил, что вы загружали свой счетчик каждый раз, когда загружали встречи. Также вы переходили в times в window.setInterval.

Мой код, тестирующий эту функцию:

$(document).ready(function() {
    $('#loading').html("<img src='loader64.gif' />").hide();
    ScheduledAction(LoadAppointments, 1, 100);
});

function ScheduledAction(func, times, interval) {
    var ID = setInterval(function() {
        if (times > -1) {
            if (--times <= 0)
                clearInterval(ID);
        }
        func();
    }, interval);
}

function LoadAppointments() {

    $("#content").empty();
    $('#loading').show();
    $.get('contentServer.php',
            function(data) {
                if (data != '') {
                    $('#content').append(data);
                    $('#loading').hide();
                }
                else {
                    $('#loading').fadeOut(3000);
                }
            });
}

Файл php:

//contentServer.php

<?php

echo 'The quick brown fox jumped over the lazy dogs back';

?>
0 голосов
/ 27 мая 2010

Вы можете проверить, протекает ли DOM с помощью инструмента Drip ( артикул ) В качестве временного решения проблемы вы должны периодически периодически перезагружать всю страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...