2

IE Mobile を使用するデバイスで (Google Gears を使用して) オフラインで使用するアプリケーションを作成しました。デバイスでメモリ リークが発生しており、時間の経過とともにデバイスが使用できなくなります。

問題のページは、ローカルの 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";
}

それは何らかの形で循環参照を構成しますか?

ジェイク

4

2 に答える 2

0

ページのコンテンツを変更する多くのスクリプトを実行している場合は、過去に使用した古いAJAXブックで言及されたIEメモリリークがあります(これはおそらくここに当てはまる可能性があります)。ページをアンロードするときは、変更したdiv / spansなどをクリアする必要があります。そうしないと、その内容がメモリに残ります。次のようなものを試してください

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

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

クリアするときは、innerHTMLを""に設定したいと思います。次に家に帰ったら、本を見つけて、何か違うことがあれば答えを更新しようとしますが、それでその間にテストするものが得られるはずです。

于 2009-10-16T08:16:51.333 に答える
0

メモリに役立つかどうかはわかりませんが、文字列を連結する代わりに、それらを配列にプッシュして結合すると、パフォーマンスが向上します。何かのようなもの:

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>";
于 2009-10-14T22:46:38.040 に答える