AJAX 中Sys.WebForms.PageRequestManager的事件激发顺序
测试代码:
- 测试代码如下:
-
- <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="Test.aspx.cs"Inherits="AjaxCtpWebDemo.Test"%>
- <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <htmlxmlns="http://www.w3.org/1999/xhtml">
- <headrunat="server">
- <title>无标题页</title>
- </head>
- <body>
- <formid="form1"runat="server">
-
- <asp:ScriptManagerID="ScriptManager1"runat="server">
- </asp:ScriptManager>
- <%=DateTime.Now.ToString()%><hr/>
- <asp:UpdatePanelID="UpdatePanel1"runat="server">
- <ContentTemplate>
- <%=DateTime.Now.ToString()%>
- <hr/>
- <asp:ButtonID="Button1"runat="server"Text="Button"/>
- </ContentTemplate>
- </asp:UpdatePanel>
- <mce:scripttype="text/javascript"language="javascript"><!--
- Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(
- function(sender,e)
- {
- alert("add_initializeRequest");
- }
- );
- Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
- alert("add_endRequest");
- }
- );
- Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(
- function(sender,e){
- alert("add_beginRequest");
- Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(
- alert("add_pageLoaded");
- Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(
- alert("add_pageLoading");
-
- </form>
- </body>
- </html>
最终结果如下:
1.页面第一次进入时,会首先激发add_pageLoaded事件
2.异步提交时,事件的激发顺序如下:
add_initializeRequest
add_beginRequest
add_pageLoading
add_pageLoaded
add_endRequest
add_pageLoaded
转:http://www.cnblogs.com/fifastar/archive/2008/06/02/1212225.html
获取PageRequestManager的实例:var prm = Sys.WebForms.PageRequestManager.getInstance(); 属性prm.get_isInAsyncPostBack():判断一个异步回送是否正在进行中
方法prm.abortPostBack():把一个正在执行中的异步回送取消。
客户端页面的生命周期
1、initializeRequest: 触发时机:当一个异步请求的回送被初始化之前引发。 添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(initFunc); 移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_initializeRequest(initFunc); initFunc是该页面初始化之前要执行的客户端方法。该方法的声明为: function initFunc(sender,args) { //args的数据类型是:InitializeRequestEventArgs类型。 //args.get_postBackElement():取得初始化异步回送的元素对象。 //args.get_postBackElement().id取得初始化异步回送的元素对象的id号 //args.get_postBackElement().value取得初始化异步回送的元素对象的value值 //args.set_cancel(bool):取消初始化异步回送,即丢弃该异步回送。 } 如果异步处理的过程比较慢,在异步处理的过程中再次发出同样的请求的话,那后者的异步处理请求会取消掉前一步未处理完的请求。这就是默认的异步请求优先级--“后者优先”。 我们通常回利用initailizeRequest事件来取消一个异步回送(正在进行的回送和将要初始化的回送)。
<asp:ScriptManagerID="ScriptManager1"runat="server"/>
- <asp:UpdateProgressID="UpdateProgress1"runat="server"DisplayAfter="0"DynamicLayout="false">
- <ProgressTemplate>
- <spanstyle="color:Red"mce_style="color:Red">Loading...</span>
- </ProgressTemplate>
- </asp:UpdateProgress>
- <%=DateTime.Now%><br/>
- <asp:LabelID="Label1"runat="server"Text=""></asp:Label><br/>
- <asp:ButtonID="btnPrecedence"runat="server"Text="优先"OnClick="btnPrecedence_Click"/>
- <asp:ButtonID="Button2"runat="server"Text="普通"OnClick="btnPrecedence_Click"/>
- </ContentTemplate>
- </asp:UpdatePanel>
- <divid="Message"style="color:Red"mce_style="color:Red">
- </div>
- varlastPostBackButtonId=null;
- varbtnPrecedenceId="<%=this.btnPrecedence.ClientID%>"
- Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(
- {
-
- varprm=Sys.WebForms.PageRequestManager.getInstance();
- //是否已有异步刷新
- if(prm.get_isInAsyncPostBack())
- if(lastPostBackButtonId==btnPrecedenceId)
- e.set_cancel(true);
- if(e.get_postBackElement().id==btnPrecedenceId)
- showMessage("不可重复发起优先的刷新1。");
- }else
- showMessage("请等待优先的刷新结束2。");
- return;
- elseif(e.get_postBackElement().id==btnPrecedenceId)
- showMessage("发起优先的刷新,普通的刷新将被取消3。");
- else
- showMessage("重新发起普通刷新,前一次将被取消4。");
- lastPostBackButtonId=e.get_postBackElement().id;
- //--></mce:script>
- <mce:scripttype="text/javascript"language="javascript"><!--
- vartimeoutSeed=null;
- functionshowMessage(message,timeout)
- $get("Message").innerHTML=message;
- //连续发送请求,把前一个清楚掉
- if(timeoutSeed)
- window.clearTimeout(timeoutSeed);
- timeoutSeed=window.setTimeout(function(){$get("message").innerHTML="";
- },timeout||2500)
- //--></mce:script>
protectedvoidPage_Load(objectsender,EventArgse)
- voidbtnPrecedence_Click( Thread.Sleep(3000);
- Buttonbutton=senderasButton;
- Label1.Text=String.Format("您点击了“{0}”按钮",button.Text);
- }
2、beginRequest: 触发时机:在异步请求初始化完成,且向服务器提出请求之前引发。 添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginFunc); 移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(beginFunc); beginFunc是向服务器提出请求之前要执行的客户端方法。该方法的声明为: function beginFunc(sender,255)">//args的数据类型是:BeginRequestEventArgs类型。 //args.get_postBackElement():取得初始化异步回送的元素对象。 } 我们通常在beginRequest事件中设置一个标头,或是启始化一个动化告知用户正在进行请求处理。
<asp:UpdatePanelID="UpdatePanel1"runat="server">
- <asp:ButtonID="Button1"runat="server"Text="Button1"OnClick="Button_Click"/>
- <Triggers>
- <asp:AsyncPostBackTriggerControlID="Button2"/>
- </Triggers>
- <asp:UpdateProgressID="UpdateProgress1"runat="server"DisplayAfter="0"AssociatedUpdatePanelID="UpdatePanel1">
- <hr/>
- <asp:ButtonID="Button2"runat="server"Text="Button2"OnClick="Button_Click"/>
- Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(
- if(e.get_postBackElement().id!="<%=this.Button2.ClientID%>")
- varupdateProgress=$get("<%=this.UpdateProgress1.ClientID%>");
- vardynamicLayout=<%=this.UpdateProgress1.DynamicLayout.ToString().ToLower()%>;
- if(dynamicLayout)
- updateProgress.style.display="block";
- updateProgress.style.visibility="visible";
- )
- //--></mce:script>
voidButton_Click( Thread.Sleep(2000);
- }
3、pageLoading: 触发时机:异步回送已经被服务器接收并响应,但还没有对页面进行任何更新之前引发 添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(loadingFunc); 移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_pageLoading(loadingFunc); loadingFunc是页面更新之前要执行的客户端方法。该方法的声明为: function loadingFunc(sender,255)">//args的数据类型是:PageLoadingEventArgs类型。 //args代表内容将要被更新或删除的UpdatePanel控件的<div>。 //var arr = args.get_panelsDeleting(); 取得将被删除的各个UpdatePanel控件的<div> //var arr = args.get_panelsUpdating();取得将被更新的各个UpdatePanel控件的<div> }
5、endRequest: 触发时机:回送请求处理完毕后,就会引发endRequest事件。 添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endFunc); 移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(endFunc); endFunc是页面请求完成后执行的客户端方法。该方法的声明为: function endRequest(sender,255)">//args的数据类型是:EndRequestEventArgs类型 //var err = args.get_error():判断是否发生错误,并取得错误对象。 //var em = args.get_error().message:取得错误的出错信息。 //args.set_errorHandled(true):设置错误已被处理。 //var gm = args.get_errorHandled():判断错误是否被处理。 //异步请求发生异常后,如果程序员不在客户端捕获处理的话,PageRequestManager对象会将其以对话框的形式弹出异常的信息。如果程序员想自己编写错误处理代码,而不交由PageRequestManager对象处理的话。那程序员可以通过args.get_error().message属性取得错误信息,然后编写异常处理代码,最后记得执行args.set_errorHandled(true)。这样就阻止异常继续回返给PageRequestManager对象。具体使用在后面将详细说明。 }
<asp:ButtonID="btnError"runat="server"Text="Error"OnClick="btnError_Click"/>
- <asp:ButtonID="btnTimeout"runat="server"Text="Timeout"OnClick="btnTimeout_Click"/>
- <inputid="button"type="button"value="Abort"onclick="Sys.WebForms.PageRequestManager.getInstance().abortPostBack();"/>
- <asp:ButtonID="btnDataItem"runat="server"Text="ReisterDataItem"OnClick="btnDataItem_Click"/>
- <mce:scripttype="text/javascript"><!--
- Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
- if(e.get_error())
- e.set_errorHandled(true);
- if(e.get_response().get_timedOut())
- showMessage("您的请求已超时。")
- }if(e.get_response().get_statusCode()!=200)
- showMessage("遇到未知错误。");
- showMessage(e.get_error().message);
- if(e.get_response().get_aborted())
- showMessage('您的请求已取消')
- varupId="<%=this.UpdatePanel1.ClientID%>";
- varitem=e.get_dataItems()[upId];
- showMessage("您注册了:"+item);
- });
- copy
ScriptManager.GetCurrent(Page).AsyncPostBackTimeout=3;
- voidbtnError_Click(inttwo=2;
- inti=3/(two-2);
- voidbtnTimeout_Click( Thread.Sleep(5000);
- voidbtnDataItem_Click( ScriptManager.GetCurrent(this).RegisterDataItem(UpdatePanel1,DateTime.Now.ToString());
- }
4、pageLoaded: 触发时机:回送完成页面区域被更新之后引发。 添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(loadedFunc); 移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_pageLoaded(loadedFunc); loadedFunc是页面更新后要执行的客户端方法。该方法的声明为: function loadedFunc(sender,255)">//args的数据类型是:PageLoadedEventArgs类型 //args代表更新的或创建的UpdatePanel控件的<div> //var arr = args.get_panelsUpdated();取得被更新的各个UpdatePanel控件的<div> //var arr = args.get_panelsCreated();取得新创建的各个UpdatePanel控件的<div> } (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|