ASP.NET AJAX 中的 Response.Write

 UpdatePanel在回传后,都是通过客户端Sys.Net.XMLHttpExecutor实例的get_responseData方法来获取返回的HTML,然后解析,之后经过一些“乱七八糟”的处理后会调用Sys.WebForms.PageRequestManager实例的_endPostBack函数,呵呵,何不在这get_responseData、_endPostBack上下功夫。惯用的手法,偷梁换柱,写个函数将get_responseData、_endPostBack替换,JS代码如下
  
  
  
   1
   2window.attachEvent("onload",function()
   3{
   4 if(window.oc_webcontrols_aspnetAjaxScriptLoaded!=true && window.Sys && window.Sys.WebForms && window.Sys.WebForms.PageRequestManager)
   5 {
   6 window.oc_webcontrols_aspnetAjaxScriptLoaded=true;
   7 var old_endPostBack=Sys.WebForms.PageRequestManager._instance._endPostBack
   8 Sys.WebForms.PageRequestManager._instance._endPostBack=function(error,response)
   9 {
  10 if(response && response._xmlHttpRequest)
  11 {
  12 var responseText=response._responseText
  13 old_endPostBack.apply(this,arguments);
  14 Handle(responseText);
  15 window.setTimeout("document.body.fireEvent('onload');",50);
  16 }
  17 }
  18
  19 function Handle(responseText,insertToBody)
  20 {
  21 var div=document.createElement("Div");
  22 div.innerHTML=" "+responseText;
  23
  24 var links=div.getElementsByTagName("link");
  25 for(var i=0;i<links.length;i++)
  26 {
  27 var style=document.createStyleSheet(links[i].href);
  28 links[i].outerHTML="";
  29 }
  30
  31 var styles=div.getElementsByTagName("style");
  32 for(var i=0;i<styles.length;i++)
  33 {
  34 var style=document.createStyleSheet();
  35 style.cssText=styles[i].innerHTML;
  36 styles[i].outerHTML="";
  37 }
  38
  39 var scripts=div.getElementsByTagName("script");
  40 for(var i=0;i<scripts.length;i++)
  41 {
  42 var script=scripts[i];
  43 try
  44 {
  45 if(script.src!="" && script.src!=null)
  46 {
  47 var scriptElement=document.createElement("script");
  48 scriptElement.src=script.src;
  49 scriptElement.language=script.language
  50 scriptElement.type=script.type;
  51 document.body.appendChild(scriptElement);
  52 }
  53 else
  54 {
  55 eval(script.innerHTML);
  56 }
  57 }
  58 catch(e)
  59 {
  60 alert("脚本注册失败:\n"+e.message+"\n\n"+script.outerHTML);
  61 }
  62 script.outerHTML="";
  63 }
  64
  65 if(insertToBody)
  66 {
  67 document.body.insertAdjacentHTML("afterBegin",div.innerHTML.substring(6));
  68 }
  69 }
  70
  71 var get_responseData=Sys.Net.XMLHttpExecutor.prototype.get_responseData
  72 Sys.Net.XMLHttpExecutor.prototype.get_responseData=function()
  73 {
  74 if(this._responseText==null)
  75 {
  76 this._responseText=get_responseData.call(this);
  77 var index=this._responseText.match(/\d{1,4}\|updatePanel\|/i).index;
  78 if(index>0)
  79 {
  80 this.resposneWriteText=this._responseText.substring(0,index);
  81 this._responseText=this._responseText.substring(index);
  82 Handle(this.resposneWriteText,true);
  83 }
  84 }
  85 return this._responseText;
  86 }
  87 }
  88
  89})
  
   以上方法只对IE有用 ,FF下要稍作修改,仅用 UpdatePanel 测试通过。
posted @ 2008-02-17 21:00  马建康  阅读(530)  评论(0)    收藏  举报