Prototype忽略等待连接的方法

来源:互联网 发布:找北极星的软件 编辑:程序博客网 时间:2024/06/05 20:28

    由于大量向服务器端发送请求,IE7大概是十个线程左右的时候,在Ajax请求未成功响应时关掉浏览器,反复几次就会造成页面僵死,在head中加入一下代码,我的理解是拦截每一个实例化得Request对象并分配响应的handler,这样就可以使ajax发送请求在onload方法中执行,避免了unonload方法无法调用导致连接无法释放的现象。

Code:
  1. Ajax.Request0 = Ajax.Request;  
  2. var mArrUpdaters = [];  
  3. Ajax.Request = function(a, b, c, d, e, f){ 
  4.   mArrUpdaters.push([a, b, c, d, e, f]); 
  5. Event.observe(window, 'load'function(){   
  6.   for(var i=0;i<mArrUpdaters.length;i++){   
  7.       var args = mArrUpdaters[i];   
  8.       new Ajax.Request0(args[0], args[1], args[2], args[3], args[4], args[5]);   
  9.   }   
  10.   mArrUpdaters = null;   
  11.   Ajax.Request = Ajax.Request0;   
  12. });   
  13. if (window.attachEvent) {   
  14. var events= ['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];     
  15.    window.attachEvent("onunload"function(){   
  16.      var elements = document.all;   
  17.      for(var i = 0 ; i < elements.length; i ++){   
  18.          var curElement = elements[i];   
  19.          for(var j = 0 ; j < events.length; j ++){   
  20.              curElement[events[j]] = null;   
  21.          }   
  22.      }   
  23.      if(window.ajaxArray){   
  24.         for(var j = 0 ; j < ajaxArray.length ; j ++){   
  25.             try{   
  26.                 ajaxArray[j].abort();   
  27.             }catch(e){   
  28.                 alert(e.message);   
  29.             }   
  30.         }   
  31.      }   
  32.      CollectGarbage();   
  33.    });   
  34. }  

在prototype中在Ajax.Base对象中加入abort()方法并要在对象初始化时将自身放入数组指定数组中,Ajax.Base对象代码如下所示:

在initialize中加入将当前对象加入数组的代码:

Code:
  1. //add one array to store AjaxObjects   
  2. if(!window.ajaxArray){   
  3.     window.ajaxArray = [];   
  4. }   
  5. window.ajaxArray.push(this); 

在Ajax.Base对象中加入abort()方法:

Code:
  1. abort : function() {   
  2.     this.transport.onreadystatechange = Prototype.emptyFunction;  
  3.     this.transport.abort();   
  4.     Ajax.activeRequestCount--;   
  5. }  

 

这样不管是调用Ajax.Updater还是Ajax.Request都会执行到此段代码并能成功在页面unonload时忽略所请求的连接避免页面僵死的现象。

原创粉丝点击