У меня есть приложение 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>
Вы повторно создаете 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);
});
}
Reloading
предполагает, что вы загружаете одни и те же данные несколько раз. Разве вы не можете отслеживать на сервере то, что уже загружено, и только отправлять новые / измененные вещи?