Я разрабатываю внутреннее веб-приложение для службы поддержки, в котором я работаю, предназначенное для работы в полноэкранном режиме на больших телевизорах по всей комнате с отображением соответствующих данных для парней, принимающих вызовы. Мы используем Internet Explorer 8 в Windows 7 (политика безопасности компании запрещает использовать любой другой браузер) и jQuery 1.6.2 . Все сценарии и данные хранятся в локальной сети - из Интернета ничего не выходит.
По сути, приложение запрашивает несколько файлов XML (генерируемых серверными сценариями) для отображения текущей информации, такой как:
- статистика для каждой очереди вызовов, например, количество ожидающих вызовов (перезагружается каждые 5 секунд)
- текущие объявления (отображаются в формате слайд-шоу с использованием цикл jQuery , перезагружается при достижении конца текущего списка объявлений)
В моем тестировании в Firefox, Chrome и т. Д. Все работает прекрасно. Но в Internet Explorer, если страница остается открытой более 10 минут или около того, весь браузер начинает зависать и зависать.
Я провел немало исследований по утечкам памяти в javascript / jQuery, и хотя нашел несколько интересных статей, большинство из них связано с утечками, возникающими при создании или удалении элементов в jQuery - то, что я не делаю.
Я по сути работаю так:
- Загрузка XML из скрипта
- Итерация по каждому из набора элементов (например, очередей вызовов), затем присвоение соответствующих дочерних элементов переменным.
- Используйте эти переменные, чтобы собрать простую строку HTML (используя массив, я прочитал, что построение строк таким образом более эффективно для памяти, чем построение строки с использованием конкатенации, например,
string = string + 'blarg';
)
- HTML выводится прямо в ожидающий контейнер
<div>
, заменяя все, что было в нем раньше.
Все выглядит примерно так
$.get('dashboard-queues.asp', function(data) {
var allQueues = new Array();
$(data).find('queue').each(function() {
var thisQueue = new Array(); // array used to build HTML string for this queue
var callsWaiting = parseFloat($(this).find('waiting').text());
var activeCalls = parseFloat($(this).find('active').text());
// (etc...)
thisQueue.push("<div class='q-item'>"+callsWaiting+"</div>");
thisQueue.push("<div class='q-item'>"+activeCalls+"</div>");
// (etc...)
allQueues.push(thisQueue.join(''));
});
$("#callboard").html(allQueues.join(''));
});
Там есть небольшая дополнительная обработка, которая изменяет HTML-код, выводимый для этого фрагмента данных при определенных обстоятельствах (например, если слишком много вызовов ожидает). Кроме того, я немного обработал после вывода HTML-кода - выяснил, сколько вызовов в общей сложности ожидает, процент отказов в вызове за день и т. Д. - но это все простые вычисления.
Я был очень осторожен, чтобы сбрасывать переменные и массивы каждый раз, когда мы выполняем цикл, чтобы убедиться, что они не сохраняют данные. Похоже, не очень помог.
Я могу опубликовать более актуальный код, если это необходимо (я не хотел делать этот пост слишком гигантским для начала). Кто-нибудь может увидеть, где я могу столкнуться с какими-либо проблемами? Если кто-то может предложить более эффективные или лучшие способы выполнения того, что я пытаюсь сделать, это было бы очень кстати.
Приветствия:)