2010-05-03 17 views
8

Tôi có một trang có các trình đơn thả xuống chuỗi. Chọn một số option từ số select đầu tiên điền số thứ hai và chọn một số option từ số thứ hai select trả về một bảng kết quả phù hợp bằng cách sử dụng hàm innerHtml trên một trang trống div trên trang.Làm cách nào để bắt buộc thu thập bộ sưu tập Javascript trong IE? IE hoạt động rất chậm sau khi thực hiện các cuộc gọi AJAX và thao tác DOM

Vấn đề là, khi tôi đã thực hiện các lựa chọn của mình và một lượng đáng kể dữ liệu được đưa lên trang, tất cả các Javascript tiếp theo trên trang chạy đặc biệt chậm. Dường như tất cả dữ liệu tôi đã lấy lại thông qua AJAX để điền vào số div vẫn đang chiếm nhiều bộ nhớ. Tôi đã thử đặt đối tượng trả về có chứa kết quả AJAX thành null sau khi gọi innerHtml nhưng không có may mắn.

Firefox, Safari, Chrome và Opera đều cho thấy không có sự xuống cấp hiệu suất khi tôi sử dụng Javascript để chèn nhiều dữ liệu vào DOM, nhưng trong IE, nó rất rõ ràng. Để kiểm tra xem đó là vấn đề Javascript/DOM chứ không phải vấn đề IE cũ đơn giản, tôi đã tạo một phiên bản của trang trả về tất cả kết quả trên tải ban đầu, thay vì qua AJAX/Javascript và thấy IE không có vấn đề về hiệu suất.

FYI, tôi đang sử dụng phương thức jQuery.get của jQuery để thực hiện cuộc gọi AJAX.

EDIT Đây là những gì tôi đang làm:

<script type="text/javascript"> 
function onFinalSelection() { 
    var searchParameter = jQuery("#second-select").val(); 
    jQuery.get("pageReturningAjax.php", 
    {SEARCH_PARAMETER: searchParameter}, 
    function(data) { 
    jQuery("#result-div").get(0).innerHtml = data; 
    //jQuery("#result-div").html(data); //Tried this, same problem 
    data = null; 
    }, 
    "html"); 
} 
</script> 

tôi muốn lưu ý rằng điều này chỉ trở thành một vấn đề khi sự trở lại data là khá lớn. Nó liên quan trực tiếp đến kích thước, vì tôi có thể thấy sự suy giảm vừa phải cho kết quả kích thước trung bình và chỉ có sự suy giảm lớn khi nó là một vài trăm bản ghi + được trả về.

Trả lời

7

Sử dụng

$("#result-div").html(data); 

html() sử dụng phương pháp empty jQuery mà làm việc rất vất vả để ngăn chặn rò rỉ bộ nhớ.

bạn đã thử:

delete data; 

Tôi đang nghĩ có vấn đề hiệu suất khác trong mã của bạn gây ra sự trì trệ. Dữ liệu trả về của bạn có sử dụng png với độ trong suốt của alpha không? Tôi đã thấy rằng giết IE6 (khi bộ lọc alpha được áp dụng) và làm chậm IE7 đáng kể.

+0

Không may mắn với việc sử dụng các chức năng html hoặc xóa. Tôi chỉ trả về một bảng văn bản (nhiều hàng, nhưng chỉ văn bản) –

+0

Bạn có ràng buộc các sự kiện với các hàng, ô, văn bản bên trong các ô không? Bạn chèn bao nhiêu dữ liệu? –

+0

Có tối đa 2000 hàng, tổng cộng ~ 250kb. Tôi chỉ ràng buộc một sự kiện duy nhất trên DIV chứa toàn bộ kết quả. –

14

Bạn có thể buộc thu thập rác trong IE bằng cách sử dụng chức năng CollectGarbage, ví dụ:

if (typeof(CollectGarbage) == "function") 
    CollectGarbage(); 

Các nhà sưu tập rác JScript được mô tả chi tiết trong blog entry này: http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx

Như blog nói, GC là không thể dự đoán được, vì vậy xóa dữ liệu hoặc dữ liệu = null sẽ không lấy lại bộ nhớ ngay lập tức, nhưng cuối cùng sẽ lấy lại bộ nhớ.


Nhưng tôi nghi ngờ rằng hình phạt hiệu suất của bạn thực sự là do việc sử dụng bộ nhớ; Tôi nghĩ rằng đó là một vấn đề với dựng hình DOM.

+0

bạn có biết liệu có phương pháp tương tự nào để CollectGarbage hoạt động trong trình duyệt webkit không? – xus

+0

bạn có biết điều này cần phải được thêm vào mỗi tệp javascript trong ứng dụng của tôi không? – Ayusman

+0

Tôi không hoàn toàn chắc chắn nếu điều này đúng với JS, nhưng trong các ngôn ngữ khác, khi Garbage Collection buộc nó sẽ đẩy tất cả các đối tượng sống sót vào thế hệ tiếp theo - có thể cực kỳ bất lợi nếu bạn kết thúc đẩy rất nhiều đối tượng thoáng qua thế hệ sau. – xelco52

3

Nếu ai đó quan tâm đến không chỉ trong IE:

Buộc thu gom rác thải tại Gecko:

window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
    .getInterface(Components.interfaces.nsIDOMWindowUtils) 
    .garbageCollect(); 

Link

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