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

测试代码:

[c-sharp] view plaincopy
  1. 测试代码如下:
  2. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="AjaxCtpWebDemo.Test" %>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" >
  5. <head runat="server">
  6. <title>无标题页</title>
  7. </head>
  8. <body>
  9. <form id="form1" runat="server">
  10. <asp:ScriptManager ID="ScriptManager1" runat="server">
  11. </asp:ScriptManager>
  12. <%=DateTime.Now.ToString() %><hr/>
  13. <asp:UpdatePanel ID="UpdatePanel1" runat="server">
  14. <ContentTemplate>
  15. <%=DateTime.Now.ToString() %>
  16. <hr/>
  17. <asp:Button ID="Button1" runat="server" Text="Button" />
  18. </ContentTemplate>
  19. </asp:UpdatePanel>
  20. <mce:script  type="text/javascript" language="javascript"><!--
  21. Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(
  22. function(sender, e)
  23. {
  24. alert("add_initializeRequest");
  25. }
  26. );
  27. Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
  28. function(sender,e){
  29. alert("add_endRequest");
  30. }
  31. );
  32. Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(
  33. function(sender,e){
  34. alert("add_beginRequest");
  35. }
  36. );
  37. Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(
  38. function(sender,e){
  39. alert("add_pageLoaded");
  40. }
  41. );
  42. Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(
  43. function(sender,e){
  44. alert("add_pageLoading");
  45. }
  46. );
  47. // --></mce:script>
  48. </form>
  49. </body>
  50. </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. <mce:script type="text/javascript" language="javascript"><!--
  18. var lastPostBackButtonId=null;          //上一次事件 控件ID
  19. var btnPrecedenceId = "<%=this.btnPrecedence.ClientID %>"   //优先级高的控件ID
  20. Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(
  21. function(sender,e)
  22. {
  23. //定义一个全局PageRequestManager实例赋值给变量 prm
  24. var prm = Sys.WebForms.PageRequestManager.getInstance();
  25. //是否已有异步刷新
  26. if(prm.get_isInAsyncPostBack())
  27. {
  28. if(lastPostBackButtonId==btnPrecedenceId)       //上次跟本次都是点击优先按钮
  29. {
  30. e.set_cancel(true);//取消异步更新
  31. if(e.get_postBackElement().id==btnPrecedenceId)
  32. {
  33. showMessage("不可重复发起优先的刷新1。");
  34. }else
  35. {
  36. showMessage("请等待优先的刷新结束2。");
  37. }
  38. return;
  39. }
  40. else if(e.get_postBackElement().id==btnPrecedenceId) //本次点击是优先按钮,但上次却不是优先按钮
  41. {
  42. showMessage("发起优先的刷新,普通的刷新将被取消3。");
  43. }
  44. else //本次点击不是优先按钮,上次点击也不是优先按钮
  45. {
  46. showMessage("重新发起普通刷新,前一次将被取消4。");
  47. }
  48. }
  49. lastPostBackButtonId = e.get_postBackElement().id;
  50. }
  51. );
  52. // --></mce:script>
  53. <mce:script type="text/javascript" language="javascript"><!--
  54. var timeoutSeed = null;
  55. function showMessage(message,timeout)
  56. {
  57. $get("Message").innerHTML = message;
  58. //连续发送请求,把前一个清楚掉
  59. if(timeoutSeed)
  60. {
  61. window.clearTimeout(timeoutSeed);
  62. }
  63. timeoutSeed = window.setTimeout(function(){$get("message").innerHTML="";
  64. },timeout||2500)
  65. }
  66. // --></mce:script>
[c-sharp] view plaincopy
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. }
  4. protected void btnPrecedence_Click(object sender, EventArgs e)
  5. {
  6. Thread.Sleep(3000);
  7. Button button = sender as Button;
  8. Label1.Text = String.Format("您点击了“{0}”按钮", button.Text);
  9. }

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. <mce:script type="text/javascript" language="javascript"><!--
  18. Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(
  19. function(sender,e)
  20. {
  21. if(e.get_postBackElement().id != "<%=this.Button2.ClientID %>")
  22. {
  23. return;
  24. }
  25. var updateProgress = $get("<%=this.UpdateProgress1.ClientID %>");
  26. var dynamicLayout = <%=this.UpdateProgress1.DynamicLayout.ToString().ToLower() %>;
  27. if(dynamicLayout)
  28. {
  29. updateProgress.style.display = "block";
  30. }else
  31. {
  32. updateProgress.style.visibility = "visible";
  33. }
  34. }
  35. )
  36. // --></mce:script>
[c-sharp] view plaincopy
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. }
  4. protected void Button_Click(object sender, EventArgs e)
  5. {
  6. Thread.Sleep(2000);
  7. }

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" οnclick="Sys.WebForms.PageRequestManager.getInstance().abortPostBack();" />
  7. <asp:Button ID="btnDataItem" runat="server" Text="Reister DataItem" OnClick="btnDataItem_Click" />
  8. </ContentTemplate>
  9. </asp:UpdatePanel>
  10. <mce:script type="text/javascript"><!--
  11. Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
  12. function(sender,e){
  13. if(e.get_error())
  14. {
  15. e.set_errorHandled(true);
  16. if(e.get_response().get_timedOut())
  17. {
  18. showMessage("您的请求已超时。")
  19. }else if(e.get_response().get_statusCode() != 200)
  20. {
  21. showMessage("遇到未知错误。");
  22. }else
  23. {
  24. showMessage(e.get_error().message);
  25. }
  26. }else if(e.get_response().get_aborted())
  27. {
  28. showMessage('您的请求已取消')
  29. }
  30. else
  31. {
  32. var upId = "<%= this.UpdatePanel1.ClientID %>";
  33. var item =e.get_dataItems()[upId];
  34. showMessage("您注册了:"+item);
  35. }
  36. });
  37. // --></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>
           }

AJAX 中Sys.WebForms.PageRequestManager的事件激发顺序相关推荐

  1. ajax中的动态绑定,如何将事件与通过jQuery中的ajax生成的动态值绑定

    iPhone 5 Iphone 4S Iphone 4 基于这些复选框将通过ajax.Here生成上述选定的值是通过AJAX生成的元素: Cover Charger Headphone Calcula ...

  2. Unity3D中关于场景销毁时事件调用顺序的一点记录

    先说一下我遇到的问题,我弄了一个对象池管理多个对象,对象池绑定在一个GameObject上,每个对象在OnBecameInvisible时会进行回收(即移出屏幕就回收),但是当场景切换或停止运行程序时 ...

  3. Sys.WebForms.PageRequestManagerServerErrorException(status code 500 OR 12031)

    我们只要在响应Sys.Application的load事件即可,它会在页面第一次加载时,以及每次Partial Rendering之后被触发,我们在这时候修改页面中form元素的action属性即可, ...

  4. ajax success重复,ajax中success函数中的事件会叠加吗?

    无标题文档 *{margin:0;padding:0} calendar{width:210px;margin:100px auto; overflow:hidden;border:1px solid ...

  5. 简单解析Ajax中onreadystatechange事件的readyState属性和status属性

    简单解析Ajax中的onreadystatechange 事件 onreadystatechange 事件 当请求被发送到服务器时,我们需要执行一些基于响应的任务.每当 readyState 改变时, ...

  6. 登录页面添加回车和单击登录事件 jQuery.ajax中的 beforeSend:function () 回调函数【日常记录】

    比较有意思的地方1: 实现如下功能可以两种方法 用jQuery.ajax中的 beforeSend:function () 回调函数:如下(下方有全部代码案例) beforeSend:function ...

  7. 对ajax中onreadystatechange事件执行流程的理解

    对Ajax中onreadystatechange事件执行流程的理解 onreadystatechange 事件 当请求被发送到服务器时,我们需要执行一些基于响应的任务. 每当 readyState 改 ...

  8. Asp.net Ajax 客户端页面生命周期原生事件

    init Event [初始化事件]    在所有脚本被加载后,在任何一个对象被创建之前引发该事件.如果你打算写一个组件(脚本),init 事件提供了一个在生命周期内添加组件(脚本)到页面的点.该组件 ...

  9. ASP.NET 2.0 AJAX中Webservice调用方法示例

    ASP.NET 2.0 AJAX中能够在客户端js中很方便地调用服务器Webservice,以下为一些调用的示例.笔者安装的ASP.NET 2.0 AJAX 版本为AJAX November CTP. ...

最新文章

  1. 【转】关于HTTP中文翻译的讨论
  2. 一些很有用的技术工具
  3. VS2017简单用法
  4. oracle不存在共享内存域,Oracle数据库共享内存分配不足怎么办
  5. 好用的论文翻译工具集锦
  6. acer 4741G驱动
  7. byte[]数组转String中文乱码
  8. python新手入门——————字符串函数(2)
  9. windows7、10磁盘分区以及磁盘扩展(详细教程以及注意事项)
  10. python用matplotlib画玫瑰_用Python matplotlib 怎么画风向玫瑰图 ,能给出程序的?
  11. 嵌入式系统中的电源管理
  12. 基于STM32的12864液晶理解
  13. 磁盘IO遇到瓶颈时内存Cache的策略
  14. 报错:Module parse failed: ‘return‘ outside of function (4:1) You may need an appropriate loader
  15. Google Earth Engine(GEE)——将shp文件导出到Google硬盘中
  16. acwing 905 区间问题-区间选点
  17. 短视频、直播平台——电商直播源码第三方SDK接入教程
  18. MW150UH驱动程序Linux,水星MW150UH无线网卡驱动程序
  19. P5727 冰雹猜想(C语言)
  20. 判断是否为素数,是则返回1,否则返回0.

热门文章

  1. Hadoop单机模式安装入门(Ubuntu系统)
  2. ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置
  3. Android开发之如何实现日历控件
  4. 在新浪微博上关于敏捷的一些讨论
  5. ASP.NET 2.0 中动态添加 GridView 模板列
  6. 批量异步更新策略及 nextTick 原理
  7. 如何在 Mac 上启用 root 用户或更改 root 密码
  8. 面试精讲之面试考点及大厂真题 - 分布式专栏 23 分布式系统下分布式锁的实现
  9. 面试官系统精讲Java源码及大厂真题 - 10 Map源码会问哪些面试题
  10. Git如何处理代码冲突