2010-05-19 113 views
1

UPDATE:我在一年前發佈了這個問題,有趣的是,我在一個主要在IE7中工作的項目有同樣的問題。基本上我在WinXP SP3虛擬PC中安裝了sIEve,並且下面的代碼會發生內存泄漏。基本上,我想我在下面提供的示例代碼沒有代碼泄漏,任何幫助,將不勝感激如何解決這個window.open內存泄漏IE?

我最近在看此內存泄漏工具篩:http://home.orange.nl/jsrosman/

所以我決定測試一下該工具通過創建主頁面將打開一個彈出窗口。 我開始創建3個頁面:index.html,page1.html和page2.html,index.html頁面將打開一個鏈接到page1.html的子窗口(彈出窗口)。第1頁將鏈接到page2.html一個錨標記,而第2頁將有一個鏈接回page1.html

問題

所以在我進入index.html頁面的工具,彈出窗口打開到page1.html,然後我點擊了page2鏈接,沒有檢測到泄漏。

當我在第2頁時,我點擊鏈接返回page1,這就是工具聲稱存在鏈接的地方。泄漏似乎發生在index.html頁面上,我不知道爲什麼它會這樣做。更關心的是,我可以看到該工具檢測到的元素甚至不在我的頁面上。

有沒有人有任何使用此工具的經驗或知道這是否真的是內存泄漏? 任何樣品展示如何實現我沒有內存泄漏的事情?

INDEX.HTML

<script type="text/javascript"> 

    MYLEAK = function() { 
    var childWindow = null; 

    function showWindow() { 
    childWindow = window.open("page1.html", "myWindow");     
    return false; 
    }   
    return {  
    init: function() { 
     $("#window-link").bind("click", showWindow);    
    }  
    }  
    }(); 

    </script> 

</head> 

<body> 
<a id="window-link" href="#" on>Open Window</a> 

<script type="text/javascript"> 
    $(document).ready(function() { 
    MYLEAK.init(); 
    }); 
</script> 

</body> 
</html> 

PAGE1.HTML

<html> 
<body> 

<h1>Page 1</h1> 
<a href="page2.html">Page2</a> 
</body> 
</html> 

PAGE2.HTML

<html> 
<body> 
<h1>Page 2</h1> 
<a href="page1.html">Page1</a> 
</body> 
</html> 

欣賞你的努力。

+0

不使用window.open,但讓用戶決定他是否想要一個新的窗口/選項卡或沒有(鼠標中鍵!)將是一個好主意:p – ThiefMaster 2010-05-19 08:38:51

+0

你的意思是一個鏈接?我甚至嘗試過使用target =「_ blank」並且有類似的問題。你認爲通過在新標籤中打開它可能不會導致此類泄漏?也不是由用戶設置決定如何實際打開鏈接? – DotnetShadow 2010-05-19 09:00:30

+0

試過target =「myWindow」? – Val 2010-05-19 10:43:48

回答

1

我有測試此泄漏在Windows 2000 5.00.2195 Service Pack 4的使用IE

version: 6.0.2800.1106IS 
Chiper Strength : 128-bit 
Product ID 55736-837-5565635-04173 
Updated Versions:;SP1;Q823353;Q833989 

的以下規格保持在新打開的窗口的引用,當你關閉它(或 重新打開它) ,將引用設置爲null。這樣垃圾收集器 將收集(最終)窗口對象。如果你不這樣做,窗口 對象留在內存中,並沒有人知道它何時會被刪除。

此外,你應該總是命名你的Windows(但沒有什麼 與你的問題)。

喜歡的東西:

var wPopUp = null; 
function clickButton() 
{ 
if (wPopUp) 
{ 
if (!wPopUp.closed) 
{ 
wPopUp.close(); 
} 
wPopUp = null; 
} 

wPopUp = window.open('leak2.html', 
'wPopUp', 'width=500, height=400'); 
} 

也看看MS JS Mem Leak detector

由於IE無法完成其工作,並收回週期,它落在我們做到這一點。如果我們明確地打破了這些循環,那麼IE將能夠回收內存。據微軟稱,關閉是導致內存泄漏的原因。這當然是非常錯誤的,但是這導致了微軟給程序員提出了非常糟糕的建議,說明如何應對微軟的漏洞。事實證明,很容易打破DOM端的循環。在JScript方面打破它們幾乎是不可能的。

當我們完成一個元素,我們必須清空它的所有事件處理程序來打破這些循環。我們所要做的就是將null分配給每個事件處理程序的屬性。這可以做得非常明確,或者我們可以製作一個通用的清除功能。

+0

您好, 感謝您的答覆,我想我已經嘗試過,在我打開窗口childWindow = null之後,我放在我的showWindow()方法中的另一個測試是你的意思,還是你的意思是保留一個引用它在父窗口? 也當你說我的窗口沒有我這樣做:childWindow = window.open(「page1.html」,「myWindow」); ? – DotnetShadow 2010-05-19 11:33:10

+0

我更新了我的答案Shadow – XGreen 2010-05-19 11:57:07

+0

謝謝你,我只是通過改變綁定的方式來嘗試你的代碼: (「#window-link」)。 最初在打開窗口時沒有泄漏,但是如果您單擊彈出窗口中的鏈接Page2-> Page1-> Page2,則會發生泄漏。如果我直接打開第1頁的彈出窗口,我沒有任何問題,只有當我點擊該頁面上指向第2頁的鏈接時發現泄漏的鏈接才能確定它是否是您看到的內容? 在這個階段,我傾向於認爲該工具實際上並不正確 – DotnetShadow 2010-05-19 12:11:48