まとめ ブログ ダウンロード 掲示板 メール

れぶろぐ

< 2008-06-14 (土) 2008-06-16 (月) > 最新


2008-06-15 (日)

XMLHttpRequest オブジェクトを最後に null にしてメモリリークを避ける

PukiWiki の ajaxtree プラグイン で用いている JavaScript のコードをチェックしていたところ、 Ajax の部分のコードが、Internet Explorer でメモリリークを起こしていました。 抜粋すると、こんなコードです。

  toggle: function(event) {
    var element = event ? event.target : window.event.srcElement;

    if (element.nodeName == "LI") {
      var li = element;

      ......

      var req = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
      if (req) {
        req.onreadystatechange = function() {
          if (req.readyState == 4 && req.status == 200) {
            li.className = "expanded";
            li.innerHTML += req.responseText;
          }
        };
        req.open("GET", url, true);
        req.setRequestHeader("If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT");
        req.send("");
      }
    }
  },

こういう Ajax のコードって結構あると思うんですが、 言われてみれば確かに、メモリリークを起こすパターンに該当しています。 とりあえず jQuery のコードを参考に、以下のように修正してみました。

--- ajaxtree.js.orig
+++ ajaxtree.js
@@ -38,6 +38,7 @@
           if (req.readyState == 4 && req.status == 200) {
             li.className = "expanded";
             li.innerHTML += req.responseText;
+            req = null;
           }
         };
         req.open("GET", url, true);

IE6 だとこれでメモリリークしなくなりましたが、IE7 はまだメモリリークしてます。 うーん、もう少し真面目に対策しないとだめか?

このエントリの続き: 2008-06-20 (金), 2008-07-28 (月)
Tags: JavaScript | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink
本日のリンク元

編集