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
});
4

4 回答 4

1

似乎新的 Tip 构造可以将元素而不是工具提示文本作为参数。您可能想尝试使用它。我没有这样做,所以你必须自己尝试。首先,创建工具提示布局(包含工具提示文本的 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 的作者发送电子邮件即可。我相信他会很乐意提供帮助。

于 2009-05-31T20:05:38.330 回答
0

正如您所注意到的,简单地实例化一个新的 Tip 将意味着一个新的 Tip 对象被创建并存储在内存中。

为了解决这个问题,您需要将 Tip 分配给全局范围内的唯一变量。即实例化变量“tooltip”,然后在您的例程中使用“tooltip = new Tip”(这将允许一次仅使用 1 个工具提示,我认为这是您想要的,因为只能显示一个)。垃圾收集应该照顾其余的。

于 2009-05-31T19:50:44.817 回答
0

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

var tip = new Tip( whatever);
// before next update do delete tip;
于 2009-05-31T19:51:04.363 回答
0

看起来这实际上是 Prototype 中的内存泄漏。 据此,泄漏已在 1.6.1 中修复。

于 2009-05-31T19:58:27.143 回答