0

AJAX と setInterval を使用してサーバーからスコアの変更を取得するゴルフ リーダーボード ページで、以下の fixedtableheader プラグインを使用します。プラグインなしではすべてがうまく機能しますが、プラグインを使用すると、1 日の間に Firefox が開始時の 60MB から 1 日の終わりの前に 1.5GB になり、クラッシュする一定のメモリ リークが発生します。このコードでメモリリークを見つけられる人はいますか?

問題のページはhttp://scoring.pgalinks.net/leaderboards/lobby.cfm?from=soです

jQuery.fn.fixedtableheader = function (options) {
var settings = jQuery.extend({
    headerrowsize: 1,
    highlightrow: false,
    highlightclass: "highlight"
}, options);
this.each(function (i) {
    var $tbl = $(this);
    var $tblhfixed = $tbl.find("tr:lt(" + settings.headerrowsize + ")");
    var headerelement = "th";
    if ($tblhfixed.find(headerelement).length == 0) headerelement = "td";
    if ($tblhfixed.find(headerelement).length > 0) {
        $tblhfixed.find(headerelement).each(function () {
            $(this).css("width", $(this).width());
        });
        var $clonedTable = $tbl.clone().empty();
        var tblwidth = GetTblWidth($tbl);
        $clonedTable.attr("id", "fixedtableheader" + i).css({
            "position": "fixed",
            "top": "0",
            "left": $tbl.offset().left
        }).append($tblhfixed.clone()).width(tblwidth).hide().appendTo($("body"));
        if (settings.highlightrow) $("tr:gt(" + (settings.headerrowsize - 1) + ")", $tbl).hover(function () {
                $(this).addClass(settings.highlightclass);
            }, function () {
                $(this).removeClass(settings.highlightclass);
            });
        $(window).scroll(function () {
            if (jQuery.browser.msie && jQuery.browser.version == "6.0") $clonedTable.css({
                    "position": "absolute",
                    "top": $(window).scrollTop(),
                    "left": $tbl.offset().left
                });
            else $clonedTable.css({
                    "position": "fixed",
                    "top": "0",
                    "left": $tbl.offset().left - $(window).scrollLeft()
                });
            var sctop = $(window).scrollTop();
            var elmtop = $tblhfixed.offset().top;
            if (sctop > elmtop && sctop <= (elmtop + $tbl.height() - $tblhfixed.height())) $clonedTable.show();
            else $clonedTable.hide();
        });
        $(window).resize(function () {
            if ($clonedTable.outerWidth() != $tbl.outerWidth()) {
                $tblhfixed.find(headerelement).each(function (index) {
                    var w = $(this).width();
                    $(this).css("width", w);
                    $clonedTable.find(headerelement).eq(index).css("width", w);
                });
                $clonedTable.width($tbl.outerWidth());
            }
            $clonedTable.css("left", $tbl.offset().left);
        });
    }
});

function GetTblWidth($tbl) {
    var tblwidth = $tbl.outerWidth();
    return tblwidth;
}

};

4

0 に答える 0