2009-05-31 32 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