我有一个嵌套的类别列表这样的Django管理页面: 防止此JavaScript代码中的内存泄漏?
我写这个剧本对列表进行排序和层级形式呈现它:
{% extends "admin/change_list.html" %}
{% load i18n %}
{% block footer %}
<script>
(function(){
var rows=document.getElementById('result_list').getElementsByTagName('tr'),
table=rows[1].parentNode||rows[1].parentElement,
i=0, r, // skip the first row
data={}; // store category data
while (r=rows[++i]) {
var catName=r.getElementsByTagName('a')[0],
k=catName.innerHTML,
opts=r.getElementsByTagName('select')[0],
j=-1, opt;
while (opt=opts[++j]) {
if (!opt.selected) continue;
data[k] = {
title: k,
children: {},
parentName: opt.innerHTML,
parentId: opt.value,
catName: catName,
row: r
}
}
}
for (var sub in data) {
if (data[sub].parentName == sub) continue;
for (var sup in data) {
if (sup == data[sub].parentName) {
data[sup].children[sub]=data[sub];
data[sub].parent = data[sup];
break;
}
}
}
var alt = 0;
for (var leaf in data) {
if (data[leaf].parentName != leaf) continue;
walk(data[leaf], leaf, function (node, nodeName) {
var n=node, t=n.title;
while (n=n.parent) {
t = ' · ' + t;
}
node.catName.innerHTML = t;
node.row['class']=node.row['className']='row'+alt++%2;
table.removeChild(node.row);
table.appendChild(node.row);
});
}
function walk (leaf, leafName, cb) {
if (cb) cb(leaf, leafName);
leaf.ready = true;
for (var kid in leaf.children) {
if (leaf.children[kid].ready) continue;
walk(leaf.children[kid], kid, cb);
}
}
}());
</script>
{% endblock %}
...脚本运行良好,并该列表看起来像这样:
我的问题是:我觉得脚本很容易出现内存泄漏UAs的弱垃圾收集,因为由父/子创建的循环引用st UFF。这是我应该担心的吗?有没有更好的方法来编写脚本?我应该在脚本末尾删除一堆东西,如果是这样,什么?
你“感觉”脚本容易发生内存泄漏,或者你观察到内存泄漏? – 2010-09-05 07:56:55
我还没有看到任何东西,但我觉得IE可能会做一些愚蠢的事情,比如在页面导航时不收集垃圾。不幸的是我没有办法测试那台ATM机。 – 2010-09-05 08:01:05
你操作系统允许你观察随着时间的推移吗?如果是这样,我确定你可以设置一个原始测试,看看是否有不必要的内存泄漏... – Stefan 2010-09-05 08:25:04