2011-09-30 86 views
2

我有一個Web應用程序,您可以在其中查看/瀏覽2D網絡圖。 當你將鼠標懸停在節點的請求被髮送到服務器 - 服務器收集信息,並將其發送回客戶端 - 客戶端保存所有的信息放在一個JS類TooltipGraphListener這樣的:刪除/重置DOM節點

var w = new scripts.widget.GraphInfo({ 
    baseURL: this._baseURL, 
    basePath: 'graphs/' + this._graphName, 
    path: 'nodes/' + nid, 
    tooltip: true }); 

var domNode = w.domNode; 
dojo.removeClass(domNode, 'graphInfo'); 
domNode.setAttribute("id", nid); 
this._canvas.containerNode.appendChild(domNode); 
dojo.addClass(domNode, 'tooltip'); 
dojo.style(domNode, "opacity", 0.8); 
this._toolTips.push(w); 

我現在的問題是,如果我生成的Web應用程序的窗口小部件新圖這條線:

var tooltip = dojo.byId(id); 
if (tooltip)... 

仍然是真實的,即使我清楚_toolTips(_toolTips = [])或重新初始化整個班級(聽衆=新TooltipGraphListener ())..個別的工具提示仍然可以通過dojo.byId(id)找到;

如何重置/刪除所有這些工具提示domnodes?

+0

我剛剛說了一行this._canvas.containerNode.appendChild(domNode); 我想這就是問題所在。 – jaronimoe

回答

0

當你明確你的提示,你還必須從文件(我敢肯定有這樣做的更道場的方式,但我不使用框架)刪除其DOM節點:

for (var i = 0; i < this._tooltips.length; i++) { 
    this._canvas.containerNode.removeChild(this._tooltips[i].domNode); 
} 
this._tooltips = []; 
+0

謝謝,這是訣竅!現在很明顯,_canvas保持domnodes活着 - 我不知道爲什麼我以前沒有看到它.. – jaronimoe

+0

你可以使用'dojo.destroy' - 將它傳遞給DOM節點來銷燬。它有一些特殊的注意事項來避免老版本IE中的內存泄漏。如果這些工具提示實際上是Dijit小部件,它們有自己的銷燬方法,其中最常用的是'destroyRecursive'(它確保任何子部件也被銷燬)。 –

+0

@KenFranqueiro謝謝,'dojo.destroy'很好地工作。我不能使用'destroyRecursive',因爲我使用的工具提示不是dojo工具提示(它們不適用於我正在使用的第三方小部件)。 – jaronimoe

1

GraphInfo類必須將工具提示元素附加到DOM。無論您的班級發生什麼情況,您都必須將其刪除,否則它將始終存在。 'byId'方法在DOM中查找具有該ID的元素。

如果你真的必須能夠重置這個東西,你必須在類中構建一個dispose()方法,在這個方法中它將移除它添加的DOM元素。或者你可以爲每個實例重用相同的DOM元素,假設一次只能在頁面上顯示1(因爲它是一個工具提示,我認爲是這種情況)。

+0

好吧,所以我想這將是dispose()方法,因爲我想減少服務器調用。如果我用每個鼠標懸停創建一個新的工具提示,服務器會經常被不必要地調用。這應該做的伎倆,對不對? var node = this._canvas.containerNode while(node.hasChildNodes())node.removeChild(node.lastChild); }' – jaronimoe