Ajax 是现在 web 开发技术中的最炙手可热的技术之一。它为我们程序员提供了一种新的 web 应用程序开发模式,也给网页的访问者提供了一种全新的上网体验。我想也正是因为 ajax 的诸多优点,Microsoft 在发布了 asp.net 2.0 后又争对 ajax 启动了一个名为 Atlas 的项目。
然而,在 IE 浏览器(我使用的版本是 IE 6.0)中使用 ajax 的时候,不幸的是会出现“内存泄漏”的问题(在 Firefox 浏览器上没有这个问题)!在一个页面上,使用 ajax 调用服务器上的方法的次数很少的情况下,内存泄漏的问题是可以忽略的。然而对于某些需要频繁访问 web 服务器的应用程序来说,这是不可容忍的。我以前写过一个类似于 web messenger 的程序;在这个程序中,每 5 秒就需要访问服务器以获取新的消息。正常情况下,一般每个 IE 窗口需要的内存是 15M 左右。然而这个程序在运行的时候,它所消耗的内存在不断上升,大概 3 个小时左右就用掉了 200 多 M 的内存!而且在继续增长中...
要解决这个内存泄漏的问题,需要在执行完 ajax 方法后将创建的 XMLHttpRequest 设置成 null 值。使用改进后的 javascript 脚本调用服务器方法,对 IE 内存的使用不会有太大的影响。在我写的一个测试程序中,ajax 每 200 毫秒访问服务器(本机的)一次,从服务器获取一个动态生成的字符串,并在页面上显示出来。 IE 的内存占用一直保持在 10M 到 20M 左右。
改进后的主要的 javascript 脚本如下:
- if( ! window.XMLHttpRequest ) {
- window.XMLHttpRequest = function() {
- var xmlHttp;
- var progIDs=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
- for (var i = 0; i < progIDs.length; i++) {
- try {
- xmlHttp = new ActiveXObject(progIDs[i]); // IE
- return xmlHttp;
- }catch(ex){}
- }
- if(typeof(XMLHttpRequest)!='undefined'){
- try{
- xmlHttp = new XMLHttpRequest(); // mozilla & firefox
- return xmlHttp;
- }catch(ex){}
- }
- return null;
- }
- }
- function invokeAjax(url, data, callback){
- var xml = new XMLHttpRequest();
- var async = typeof( callback ) == "function";
- if( async ) {
- xml.onreadystatechange = doCallback;
- }
- xml.open( "POST", url, async );
- xml.send( data );
- if( ! async ) {
- return createResponse();
- }
- return true;
- function doCallback() {
- if( xml.readyState != 4 ) {
- return;
- }
- try{
- if( xml.status == 200 ) {
- // Invoke the javascript callback method
- callback( xml.responseText );
- }
- }catch( ex ){}
- // Release the XMLHttpRequest object here
- xml = null;
- }
- }