• AJAX 中Sys.WebForms.PageRequestManager的事件激发顺序


    测试代码:

    [c-sharp] view plaincopy
     
    1. 测试代码如下:  
    2.   
    3. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="AjaxCtpWebDemo.Test" %>  
    4.   
    5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
    6.   
    7. <html xmlns="http://www.w3.org/1999/xhtml" >  
    8. <head runat="server">  
    9.     <title>无标题页</title>  
    10. </head>  
    11. <body>  
    12.     <form id="form1" runat="server">  
    13.       
    14.         <asp:ScriptManager ID="ScriptManager1" runat="server">  
    15.         </asp:ScriptManager>  
    16.         <%=DateTime.Now.ToString() %><hr/>  
    17.         <asp:UpdatePanel ID="UpdatePanel1" runat="server">  
    18.             <ContentTemplate>  
    19.                 <%=DateTime.Now.ToString() %>  
    20.                 <hr/>  
    21.                 <asp:Button ID="Button1" runat="server" Text="Button" />  
    22.             </ContentTemplate>  
    23.         </asp:UpdatePanel>  
    24.        <mce:script  type="text/javascript" language="javascript"><!--  
    25.           Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(  
    26.       function(sender, e)  
    27.       {  
    28.           alert("add_initializeRequest");     
    29.       }  
    30.   );  
    31.     
    32.     
    33.   Sys.WebForms.PageRequestManager.getInstance().add_endRequest(  
    34.       function(sender,e){  
    35.           alert("add_endRequest");  
    36.       }  
    37.   );  
    38.     
    39.     
    40.   Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(  
    41.       function(sender,e){  
    42.           alert("add_beginRequest");  
    43.       }  
    44.   );  
    45.     
    46.     
    47.   Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(  
    48.       function(sender,e){  
    49.           alert("add_pageLoaded");  
    50.       }  
    51.   );  
    52.     
    53.   Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(  
    54.       function(sender,e){  
    55.           alert("add_pageLoading");  
    56.       }  
    57.   );  
    58.     
    59.     
    60. // --></mce:script>   
    61.     
    62.     </form>  
    63. </body>  
    64. </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事件来取消一个异步回送(正在进行的回送和将要初始化的回送)。      

    [c-sharp] view plaincopy
     
    1. <asp:ScriptManager ID="ScriptManager1" runat="server" />  
    2.     <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" DynamicLayout="false">  
    3.         <ProgressTemplate>  
    4.             <span style="color: Red" mce_style="color: Red">Loading...</span>  
    5.         </ProgressTemplate>  
    6.     </asp:UpdateProgress>  
    7.     <asp:UpdatePanel ID="UpdatePanel1" runat="server">  
    8.         <ContentTemplate>  
    9.             <%=DateTime.Now %><br />  
    10.             <asp:Label ID="Label1" runat="server" Text=""></asp:Label><br />  
    11.             <asp:Button ID="btnPrecedence" runat="server" Text="优先" OnClick="btnPrecedence_Click" />  
    12.             <asp:Button ID="Button2" runat="server" Text="普通" OnClick="btnPrecedence_Click" />  
    13.         </ContentTemplate>  
    14.     </asp:UpdatePanel>  
    15.     <div id="Message" style="color: Red" mce_style="color: Red">  
    16.     </div>  
    17.   
    18.     <mce:script type="text/javascript" language="javascript"><!--  
    19.         var lastPostBackButtonId=null;          //上一次事件 控件ID  
    20.         var btnPrecedenceId = "<%=this.btnPrecedence.ClientID %>"   //优先级高的控件ID  
    21.           
    22.         Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(  
    23.             function(sender,e)  
    24.             {  
    25.                 //定义一个全局PageRequestManager实例赋值给变量 prm  
    26.                 var prm = Sys.WebForms.PageRequestManager.getInstance();  
    27.                 //是否已有异步刷新  
    28.                 if(prm.get_isInAsyncPostBack())  
    29.                 {  
    30.                     if(lastPostBackButtonId==btnPrecedenceId)       //上次跟本次都是点击优先按钮  
    31.                     {  
    32.                         e.set_cancel(true);//取消异步更新  
    33.                         if(e.get_postBackElement().id==btnPrecedenceId)  
    34.                         {  
    35.                             showMessage("不可重复发起优先的刷新1。");  
    36.                         }else  
    37.                         {  
    38.                             showMessage("请等待优先的刷新结束2。");  
    39.                         }  
    40.                         return;  
    41.                     }  
    42.                     else if(e.get_postBackElement().id==btnPrecedenceId) //本次点击是优先按钮,但上次却不是优先按钮  
    43.                     {  
    44.                         showMessage("发起优先的刷新,普通的刷新将被取消3。");  
    45.                     }  
    46.                     else //本次点击不是优先按钮,上次点击也不是优先按钮  
    47.                     {  
    48.                         showMessage("重新发起普通刷新,前一次将被取消4。");  
    49.                     }  
    50.                 }  
    51.                 lastPostBackButtonId = e.get_postBackElement().id;  
    52.             }  
    53.         );  
    54.       
    55. // --></mce:script>  
    56.   
    57.     <mce:script type="text/javascript" language="javascript"><!--  
    58.             var timeoutSeed = null;  
    59.             function showMessage(message,timeout)  
    60.             {  
    61.                 $get("Message").innerHTML = message;  
    62.                 //连续发送请求,把前一个清楚掉  
    63.                 if(timeoutSeed)  
    64.                 {  
    65.                     window.clearTimeout(timeoutSeed);  
    66.                 }  
    67.                 timeoutSeed = window.setTimeout(function(){$get("message").innerHTML="";  
    68.                 },timeout||2500)  
    69.             }  
    70.               
    71.       
    72. // --></mce:script>  
    [c-sharp] view plaincopy
     
    1. protected void Page_Load(object sender, EventArgs e)  
    2.     {  
    3.   
    4.     }  
    5.     protected void btnPrecedence_Click(object sender, EventArgs e)  
    6.     {  
    7.         Thread.Sleep(3000);  
    8.         Button button = sender as Button;  
    9.         Label1.Text = String.Format("您点击了“{0}”按钮", button.Text);  
    10.     }  

    2、beginRequest:
           触发时机:在异步请求初始化完成,且向服务器提出请求之前引发。
           添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginFunc);
           移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(beginFunc);
               beginFunc是向服务器提出请求之前要执行的客户端方法。该方法的声明为:
               function beginFunc(sender,args)
               {
                    //args的数据类型是:BeginRequestEventArgs类型。
                    //args.get_postBackElement():取得初始化异步回送的元素对象。
               }
            我们通常在beginRequest事件中设置一个标头,或是启始化一个动化告知用户正在进行请求处理。
        

    [c-sharp] view plaincopy
     
    1. <asp:UpdatePanel ID="UpdatePanel1" runat="server">  
    2.         <ContentTemplate>  
    3.             <%=DateTime.Now %><br />  
    4.             <asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button_Click" />  
    5.         </ContentTemplate>  
    6.         <Triggers>  
    7.             <asp:AsyncPostBackTrigger ControlID="Button2" />  
    8.         </Triggers>  
    9.     </asp:UpdatePanel>  
    10.     <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" AssociatedUpdatePanelID="UpdatePanel1">  
    11.         <ProgressTemplate>  
    12.             <span style="color: Red" mce_style="color: Red">Loading...</span>  
    13.         </ProgressTemplate>  
    14.     </asp:UpdateProgress>  
    15.     <hr />  
    16.     <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button_Click" />  
    17.   
    18.     <mce:script type="text/javascript" language="javascript"><!--  
    19.         Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(  
    20.             function(sender,e)  
    21.             {  
    22.                 if(e.get_postBackElement().id != "<%=this.Button2.ClientID %>")  
    23.                 {  
    24.                     return;  
    25.                 }  
    26.                   
    27.                 var updateProgress = $get("<%=this.UpdateProgress1.ClientID %>");  
    28.                 var dynamicLayout = <%=this.UpdateProgress1.DynamicLayout.ToString().ToLower() %>;  
    29.                 if(dynamicLayout)  
    30.                 {  
    31.                     updateProgress.style.display = "block";  
    32.                 }else  
    33.                 {  
    34.                     updateProgress.style.visibility = "visible";  
    35.                 }  
    36.             }  
    37.         )  
    38.       
    39. // --></mce:script>  

     

    [c-sharp] view plaincopy
     
    1. protected void Page_Load(object sender, EventArgs e)  
    2.     {  
    3.   
    4.     }  
    5.     protected void Button_Click(object sender, EventArgs e)  
    6.     {  
    7.         Thread.Sleep(2000);  
    8.     }  

         


    3、pageLoading:
            触发时机:异步回送已经被服务器接收并响应,但还没有对页面进行任何更新之前引发
            添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(loadingFunc);
            移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_pageLoading(loadingFunc);
                 loadingFunc是页面更新之前要执行的客户端方法。该方法的声明为:
                 function loadingFunc(sender,args)
                 {
                    //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,args)
               {
                    //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对象。具体使用在后面将详细说明。
               } 

    [c-sharp] view plaincopy
     
    1. <asp:UpdatePanel ID="UpdatePanel1" runat="server">  
    2.         <ContentTemplate>  
    3.             <%=DateTime.Now %><br />  
    4.             <asp:Button ID="btnError" runat="server" Text="Error" OnClick="btnError_Click" />  
    5.             <asp:Button ID="btnTimeout" runat="server" Text="Timeout" OnClick="btnTimeout_Click" />  
    6.             <input id="button" type="button" value="Abort" onclick="Sys.WebForms.PageRequestManager.getInstance().abortPostBack();" />  
    7.             <asp:Button ID="btnDataItem" runat="server" Text="Reister DataItem" OnClick="btnDataItem_Click" />  
    8.         </ContentTemplate>  
    9.     </asp:UpdatePanel>  
    10.   
    11.     <mce:script type="text/javascript"><!--  
    12.         Sys.WebForms.PageRequestManager.getInstance().add_endRequest(  
    13.             function(sender,e){  
    14.                 if(e.get_error())  
    15.                 {  
    16.                     e.set_errorHandled(true);  
    17.                       
    18.                     if(e.get_response().get_timedOut())  
    19.                     {  
    20.                         showMessage("您的请求已超时。")  
    21.                     }else if(e.get_response().get_statusCode() != 200)  
    22.                     {  
    23.                         showMessage("遇到未知错误。");  
    24.                     }else  
    25.                     {  
    26.                         showMessage(e.get_error().message);  
    27.                     }  
    28.                 }else if(e.get_response().get_aborted())  
    29.                 {  
    30.                     showMessage('您的请求已取消')  
    31.                 }  
    32.                 else  
    33.                 {  
    34.                     var upId = "<%= this.UpdatePanel1.ClientID %>";  
    35.                     var item =e.get_dataItems()[upId];  
    36.                     showMessage("您注册了:"+item);  
    37.                 }  
    38.             });  
    39.       
    40. // --></mce:script>  
    [c-sharp] view plaincopy
     
    1. protected void Page_Load(object sender, EventArgs e)  
    2.    {  
    3.        ScriptManager.GetCurrent(Page).AsyncPostBackTimeout = 3;  
    4.    }  
    5.    protected void btnError_Click(object sender, EventArgs e)  
    6.    {  
    7.        int two = 2;  
    8.        int i = 3 / (two - 2);  
    9.    }  
    10.    protected void btnTimeout_Click(object sender, EventArgs e)  
    11.    {  
    12.        Thread.Sleep(5000);  
    13.    }  
    14.    protected void btnDataItem_Click(object sender, EventArgs e)  
    15.    {  
    16.        ScriptManager.GetCurrent(this).RegisterDataItem(UpdatePanel1, DateTime.Now.ToString());  
    17.    }  


    4、pageLoaded:
            触发时机:回送完成页面区域被更新之后引发。
            添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(loadedFunc);
            移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_pageLoaded(loadedFunc); 
               loadedFunc是页面更新后要执行的客户端方法。该方法的声明为:
               function loadedFunc(sender,args) 
               {
                    //args的数据类型是:PageLoadedEventArgs类型
                    //args代表更新的或创建的UpdatePanel控件的<div>
                    //var arr = args.get_panelsUpdated();取得被更新的各个UpdatePanel控件的<div>
                    //var arr = args.get_panelsCreated();取得新创建的各个UpdatePanel控件的<div>
               }

  • 相关阅读:
    html中script标签的使用方法
    css关于浮动的高度塌陷
    canvas用数组方式做出下雨效果
    canvas简易画板。
    html5新标签
    闭包的意义及用法
    字符串的添加方法
    js几种数组遍历方法.
    简易网页打卡页面.
    回忆继承多态
  • 原文地址:https://www.cnblogs.com/yyxz/p/3823026.html
Copyright © 2020-2023  润新知