0

Web ページに Google マップがあり、geoxml3 を使用してレイヤーを解析しています (多くの目印付き)。

新しい .kml ファイルをプルするために 10 秒ごとに jquery をトリガーするタイマーがあります。ただし、新しいレイヤーを解析する前に、古いレイヤーを削除したいと思います。

質問:削除/破棄する正しい方法は何ですか?

があることは知っていますがgeoXml.hideDocument();、それはレイヤーを非表示にするだけで、レイヤーを削除/破棄しませんか? (以下は hideDocument() の実装です)

refreshMap() - 前のレイヤーを非表示にして新しいレイヤーを表示

$.ajax({
    url: url,
    dataType: 'json',
    type: 'get',
    contentType: 'application/x-www-form-urlencoded',
    data: "",
    success: function (data, textStatus, jQxhr) {
        if (data['success'] == 1) {
            if (geoXml) 
                geoXml.hideDocument();
            var src = data['kml'];
            geoXml = new geoXML3.parser({
                map: map,
                suppressInfoWindows: false,
                singleInfoWindow: true,
                infoWindow: infowindow,
                zoom : false
            });
            geoXml.parse(src);
            geoXml.showDocument();
        }
    },
    error: function (jqXhr, textStatus, errorThrown) {
        console.log(errorThrown);
    }
});

これは機能しますが、10 秒ごとにデータを取得し続けると、ページが 1 時間開かれると遅延が発生するのではないかと心配です。理由は、オーバーレイが実際には破棄/削除されていないためです。それらはまだメモリ上にあり、それへの参照を失っているだけです (現在、新しいレイヤーへの参照ポイントのため)。

アップデート

オンラインでいくつかの情報を見つけましたが、この実装について心配する必要はないようです。

「Javascript はガベージ コレクションであるため、オブジェクト自体を削除する必要はありません。オブジェクトを参照する方法がなくなった時点で削除されます。」

4

1 に答える 1

0

これを効果的に行うテストケース があります:

filename="http://www.geocodezip.com/dynamicmarkerkml.php";
geoXml.parse(filename);
setInterval("geoXml.hideDocument();geoXml.parse(filename)", 5000);

私が見ることができるメモリリークはなく、何日も実行しています(最近ではなく、ある時点で)。

于 2016-10-30T16:21:34.007 に答える