Как я могу предотвратить утечки памяти в IE Mobile? - PullRequest
2 голосов
/ 21 сентября 2009

Я написал приложение для использования в автономном режиме (с Google Gears) на устройствах, использующих IE Mobile. Устройства испытывают утечки памяти с такой скоростью, что устройство со временем перестает работать.

Страница проблемы извлекает записи из локальной базы данных Gears и отображает таблицу каждой записи со ссылкой в ​​последнем столбце каждой строки, чтобы открыть запись (ссылка просто onclick = "open ('myID')") , Когда они закончили с записью, они возвращаются в таблицу, которая отображается повторно. Похоже, проблема заключается в повторном построении этой таблицы. В основном события onclick.

Таблица генерируется по существу так:

var tmp="";
for (var i=0; i<100; i++){
 tmp+="<tr><td>row "+i+"</td><td><a href=\"#\" id=\"LINK-"+i+"\""+
  " onclick=\"afunction();return false;\">link</a></td></tr>";
}

document.getElementById('view').innerHTML = "<table>"+tmp+"</table>";

Я ознакомился с распространенными причинами утечек памяти и попытался установить событие onclick для каждой ссылки на «null» перед повторным рендерингом таблицы, но, похоже, утечка все равно произошла.

У кого-нибудь есть идеи?

Если это имеет значение, функция, вызываемая из каждой ссылки, выглядит следующим образом:

function afunction(){
 document.getElementById('view').style.display="none";
}

Будет ли это каким-либо образом круговой ссылкой?

Джейк

Ответы [ 2 ]

0 голосов
/ 16 октября 2009

Если вы выполняете много сценариев, которые изменяют содержимое страницы, есть утечка памяти IE, о которой упоминалось в старой книге AJAX, которую я использовал в прошлом (и она вполне может быть здесь). Когда страница выгружается, вам необходимо очистить любые измененные элементы div / spans / etc, иначе их содержимое останется в памяти. Попробуйте что-то вроде

<script type="text/javascript">
window.onunload = clearAJAXContent;

function clearAJAXContent() {
/* clear any dynamic content placeholders here*/
}
</script>

Я полагаю, что при очистке вы хотите установить innerHTML на "". Когда я вернусь домой в следующий раз, я попытаюсь найти книгу и обновить свой ответ, если что-то будет другим, но это должно дать вам кое-что для проверки за это время

0 голосов
/ 15 октября 2009

Я не знаю, поможет ли это с памятью, но вместо объединения ваших строк вы можете поместить их в массив и объединить их для повышения производительности. Что-то вроде:

var tmp=[];
for (var i=0; i<100; i++){
 tmp.push("<tr><td>row "+i+"</td><td><a href=\"#\" id=\"LINK-"+i+"\""+
  " onclick=\"afunction();return false;\">link</a></td></tr>");
}

document.getElementById('view').innerHTML = "<table>"+tmp.join('')+"</table>";
...