2011-11-03 33 views
10

Tôi đã tìm kiếm tất cả các câu trả lời hoặc thậm chí là tham chiếu đến vấn đề cụ thể này khi không có kết quả. Tôi đang sử dụng giao diện người dùng JQuery 1.8.7 và JQuery 1.5.1. Tôi có một hộp thoại mà tôi muốn không chỉ phá hủy khi đóng, mà còn loại bỏ khỏi DOM khi đóng cửa. Điều này làm việc tốt trong Firefox. Tuy nhiên, khi tôi làm điều tương tự trong IE7, tôi thấy tăng đột biến 6MB trong việc sử dụng bộ nhớ cho trình duyệt và bộ nhớ này không bao giờ được khôi phục cho đến khi tôi tắt hoàn toàn trình duyệt. Vì vậy, suy nghĩ đầu tiên của tôi là, một cái gì đó trong hộp thoại của tôi là gây ra rò rỉ bộ nhớ. Tôi tước ra tất cả những gì tôi đã nói thêm, và thực hiện một hộp thoại đơn giản bằng cách sử dụng đoạn mã sau:Bộ nhớ IE7 lớn Rò rỉ khi phá hủy hộp thoại Giao diện người dùng JQuery trên đóng

$('<div id="testMe">hello</div>').dialog({ 
    modal: true, 
    autoOpen: true, 
    close: function() { $(this).dialog('destroy'); } 
}); 

Khi tôi mở hộp thoại này, hãy đóng nó, và sau đó làm mới trình duyệt. Tôi luôn kết thúc với bộ nhớ hơn 6MB so với trước đây. Nếu tôi mở hộp thoại này, nhưng sau đó làm mới trình duyệt trước khi đóng nó, sau đó tôi không thấy bất kỳ bộ nhớ tăng đột biến nào cả. Tôi không biết điều gì có thể gây ra điều này - tôi đã tìm thấy một loạt các chủ đề về rò rỉ bộ nhớ giao diện người dùng JQuery chung, nhưng không có bản sửa lỗi nào đã làm bất cứ điều gì để khắc phục tình trạng của tôi.

Tôi cũng nghĩ rằng có thể một số mã khác trong dự án của tôi đã bị cản trở. Đây không phải là trường hợp - Nếu tôi làm điều tương tự bằng cách sử dụng ví dụ này jsFiddle, tôi nhận được một bộ nhớ tăng đột biến là tốt! (http://jsfiddle.net/n68Af/1/). Tại thời điểm này, tôi không có ý tưởng nơi khác để chuyển hoặc những gì khác để làm. Tôi cần phải tiêu diệt các hộp thoại này và loại bỏ chúng khỏi DOM - đã có một vài trường hợp của các hộp thoại trong ứng dụng (rất lớn) của chúng tôi mà ngân hàng trên thực tế là hộp thoại Div không còn trong DOM sau khi đóng.

Chỉnh sửa: Thay đổi giá trị của cờ phương thức không có hiệu lực. Ngoài ra, tôi nhận ra rằng ví dụ của tôi không xóa phần tử khỏi DOM. Cho dù tôi có làm điều đó hay không, sự rò rỉ bộ nhớ vẫn còn. Mã trong dự án thực tế của tôi là chỉ cần loại bỏ các phần tử từ dom bằng cách sử dụng $ (this) .remove(). Tôi đơn giản hóa ví dụ, bởi vì vấn đề thực sự là "hủy bỏ" gọi để lại một số loại tham chiếu vòng tròn hoặc cái gì đó gây ra tăng đột biến bộ nhớ 6MB tôi đã đề cập.

Chỉnh sửa: Sau khi xem xét kỹ hơn, có vẻ như không quan trọng tiện ích con UI JQuery tôi đang sử dụng (Tôi đã thử Hộp thoại, tiện ích tùy chỉnh của riêng tôi và Nút). Miễn là tôi loại bỏ các yếu tố mà các widget được tham chiếu từ DOM, tôi thấy rò rỉ bộ nhớ rất lớn trong IE7. Rò rỉ bộ nhớ cũng sẽ xảy ra nếu tôi di chuyển các phần tử đến một nơi khác trong DOM. Tôi đã thử tạo một "thùng rác" DIV mà tôi đã di chuyển tất cả nội dung trong hộp thoại của mình sang thay vì xóa chúng hoàn toàn, và sự cố tương tự đã xảy ra.

Bất kỳ trợ giúp hoặc hướng nào sẽ được đánh giá cao. Cảm ơn trước guys!

+0

Bạn có thể kiểm tra mà không có phương thức = true (xin lỗi không có IE) - như trong câu hỏi SO này ở đây -> http://stackoverflow.com/questions/2095095/jquery-ui-dialog-memory-leaks – ManseUK

+0

Đặt phương thức thành false sẽ loại bỏ mức tăng bộ nhớ ban đầu khi hiển thị hộp thoại. Tuy nhiên, tăng 6MB vẫn còn ở đó khi làm mới trang web. – Adam

+0

Bạn đã gửi lỗi trên trình theo dõi jQuery chưa? – Randomblue

Trả lời

2
$('<div id="testMe">hello</div>').dialog({ 
    modal: true, 
    autoOpen: true, 
    close: function() { $(this).dialog('destroy').remove(); } 
}); 

này hoàn toàn sẽ loại bỏ hộp thoại từ DOM

+0

Xem bản chỉnh sửa của tôi cho bài đăng gốc. Việc xóa phần tử khỏi DOM không phải là vấn đề. Vấn đề là tại sao IE7 lại bị rò rỉ bộ nhớ khổng lồ như vậy khi phá hủy một hộp thoại – Adam

0

Tại sao điều này thực sự xảy ra, tôi không chắc chắn. IE có một lịch sử có lỗi lạ kể từ khi IE bắt đầu. Tùy chọn tốt nhất cho bạn để đi, là update thư viện jQuery của bạn lên phiên bản mới nhất. Nếu điều này không hiệu quả, bạn có thể thử và create your own dialog không thực sự khó.

Sự cố có thể nằm trong thực tế là việc xóa phần tử khỏi DOM dường như bị trục trặc. Trong trường hợp đó, bạn có thể sử dụng lại đối tượng hộp thoại và phần tử để bạn không cần phải .remove() nó.

+0

Tại sao lại là downvote? Nếu bạn không đồng ý, tôi muốn một số đầu vào về điều đó. –

Các vấn đề liên quan