2009-05-31 80 views
0

我正在尝试动态更新使用Prototip和Prototype制作的工具提示。我试图做到这一点的方式可能不是最好的方法(所以如果你知道一个更好的方法,这将是有益的),但唯一的办法,我可以想到做到这一点将保持JavaScript的div元素和更新div元素中的javascript以更新工具提示。但是,这似乎是内存泄漏,因为每次更新javascript时,都会创建一个新的Tip对象并将其存储在内存中。如果没有更好的方法,我该如何清除内存?如何从环状对象中释放内存

我做了这个简单的脚本来测试内存泄漏,现在我需要弄清楚如何让这个内存泄漏是在这个例子中修补。

for (i=0; i<1000; i++) { 
    $('testdiv').update("<script type='text/javascript'> new Tip('chips_tip', 'Your Chips', {style: 'creamy',stem: 'topLeft',hook: { mouse: true, tip: 'topLeft' },offset: { x: 10, y: 16 },delay: 0.04,width: 85}); <\/script>"); 
} 

下面是工具提示的JavaScript通常是:

new Tip('element', "Description", { 
    style: 'creamy', 
    stem: 'topLeft', 
    hook: { mouse: true, tip: 'topLeft' }, 
    offset: { x: 10, y: 16 }, 
    delay: 0.04, 
    width: 85 
}); 

回答

1

看来,新提示构建体可以采取的元素,而不是工具提示文本作为参数。你可能想尝试使用它。我没有这样做,所以你必须自己尝试。首先,创建工具提示布局(包含工具提示文本的div标签)并像往常一样对其进行设置。将此div的样式属性设置为“display:none”。然后尝试创建这样的提示:

new Tip('source', $('tooltip_container')); 

可以使用,然后更改工具提示的文字:

$('tooltip_container').update('new tooltip text'); 

这是不够分配工具提示构建一个变量在全局空间,因为它在我看来,prototip插入它自己的工具提示html的东西到dom中。我的猜测是,每次你打电话给“新提示”时,你都会在dom中添加额外的html。这些对象然后引用dom节点,所以它们从不被垃圾回收。使用测试代码和萤火虫检查dom应该很容易。

你最后的选择就是看prototip源代码,看看它是否有某种一个的setToolTipText功能。然后,你也许能够做这样的事情:

var tooltip = new Tip('element', 'text'); 
// snip 
tooltip.setText('some new text'); 

如果没有帮助,只是通过电子邮件prototip的作者。我相信他会很乐意提供帮助。

+0

谢谢,我会试试这个报告,如果这个工作。 – 2009-05-31 20:29:24

0

正如你已经注意到了,只是实例化一个新的提示将意味着创建一个新的提示对象,并存储在内存中。

要解决这个问题,需要将提示分配给一个独特的可变在全球范围内。 即实例变量“提示”,然后在你的日常使用“工具提示=新的提示”(这将只允许1提示是在一个时间,我会假设使用的是你想要的,因为只有一个能显示)。垃圾收集应该照顾其余的。

0

通过实例的“提示”对象实际执行构造函数调用,例如简单的函数调用,它相应地处理和更新可视元素,但一旦这个对象没有被任何变量引用,它应该被垃圾回收器收集。如果你想确定你可以做下一个:

var tip = new Tip(whatever); 
// before next update do delete tip; 
0

它看起来像这实际上是在Prototype中的内存泄漏。 According to this,泄漏被固定在1.6.1

+0

我正在使用Prototype 1.6。1 – 2009-05-31 20:27:42