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 测试通过。
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 测试通过。