惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy & Cybersecurity Law Blog
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
罗磊的独立博客
F
Fortinet All Blogs
T
Threatpost
Y
Y Combinator Blog
博客园_首页
美团技术团队
Security Latest
Security Latest
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
V
V2EX - 技术
The Cloudflare Blog
L
LINUX DO - 热门话题
博客园 - 司徒正美
Jina AI
Jina AI
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
The Hacker News
The Hacker News
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Latest news
Latest news
NISL@THU
NISL@THU
Google DeepMind News
Google DeepMind News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
雷峰网
雷峰网
Application and Cybersecurity Blog
Application and Cybersecurity Blog
B
Blog RSS Feed
W
WeLiveSecurity
D
DataBreaches.Net
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
Spread Privacy
Spread Privacy
Know Your Adversary
Know Your Adversary
TaoSecurity Blog
TaoSecurity Blog
S
Securelist
Help Net Security
Help Net Security

博客园 - moge

新建的网站 八方达物流网 How to Implement an Automatic Sliding Window in a Partitioned Table on SQL Server 2005 SQL Server 2005 Partitioned Tables and Indexes 如何估算数据库的大小 MSDN链接 Enabling Change Data Capture SQL Server 操作集锦 转一篇很经典的房价文章 在SharePoint中激活Page Library功能 Database Coding Standard and Guideline 计算机电子书免费下载列表 3 计算机电子书免费下载列表 2 计算机免费电子书下载 1 国外可以赚钱的免费硬盘 推荐一个下载电子书的网站 不需要注册 Javascript中的apply和call函数 继承CollectionBase的类的xml序列化 101个设计模式 Design Patterns 用C#操作Person or Group列在SharePoint中
ASP.NET AJAX客户端生命周期分析(实践篇)(2)
moge · 2009-03-01 · via 博客园 - moge

Posted on 2009-03-01 19:42  moge  阅读(211)  评论()    收藏  举报

三、典型场所下事件发生顺序解析

实际环境下,事件的触发顺序依赖于页面中使用了什么控件以及发生了什么类型的请求(初始化请求,传统回送或是异步回送)。下面,我们来归纳一下几种常见场所下事件的引发顺序。

(一)初始请求阶段引发的事件顺序

在页面的初始请求阶段,仅引发有限的几个客户端事件。假设下面就是初始化请求的情景:

◆Web页面中包含一个ScriptManager控件,且该控件的SupportsPartialRendering和EnablePartialRendering属性都置为true。
◆请求为GET类型;
◆服务器能正常响应。

在这种情况下,将依次发生以下客户端事件:

1、初始化请求发生给服务器;
2、客户端接收到响应;
3、Application实例引发init事件;
4、Application实例引发load事件。

请注意,init事件仅在整个页面生命周期过程中的Application实例化时发生一次,它不会再被后来的异步回送所引发。在初始化请求(注意是请求)期间,再没有任何的PageRequestManager事件引发。

(二)异步回送阶段引发的事件顺序

在一次异步回送中,将有一些页面数据被发送到服务器,接收一个服务器端的响应,然后更新页面的相应部分。我们不妨假定存在如下的一个异步回送的场所:

◆页面中包括一个ScriptManager控件,并且该控件的SupportsPartialRendering和EnablePartialRendering属性都为true;
◆页面中存在一个UpdatePanel控件,并且此控件的ChildrenAsTriggers属性值为true;
◆在UpdatePanel控件内部存在一个用于引发异步回送的按钮;
◆成功地从服务器端获得响应。

那么,上面情况将对应下面的客户端事件发生顺序:

1、点击UpdatePanel控件中的按钮时,引起了一个异步回送;
2、PageRequestManager实例引发initializeRequest事件;
3、PageRequestManager实例引发beginRequest事件;
4、请求被发送到服务器;
5、客户端接收到响应;
6、PageRequestManager实例引发pageLoading事件;
7、PageRequestManager实例引发pageLoaded事件;
8、Application实例引发load事件;
9、PageRequestManager实例引发endRequest事件。

请注意Application的load事件发生在PageRequestManager的pageLoaded事件之后且在endRequest事件之前。

(三)存在多个异步回送时事件引发的顺序问题

当之前的一个请求正在服务器端或浏览器中运行时,用户又发送了一个新的请求时,则发生了多个异步回送。假设下面的场景描述了多个异步回送的情况。

◆页面包括一个ScriptManager控件,并且该控件的SupportsPartialRendering和EnablePartialRendering属性都为true。
◆页面包含一个UpdatePanel控件。
◆在UpdatePanel中有一个引发异步回送的按钮控件被点击两次。第二次的点击发生在服务器端正在处理第一次点击发起的请求。
◆获得了从服务器端返回的对第一次请求的响应。

下面是客户端事件发生的顺序:

1、点击UpdatePanel中的按钮将引发一次异步回送。
2、PageRequestManager实例将引发initializeRequest事件。
3、PageRequestManager实例引发beginRequest事件。
4、请求被发送到服务器。
5、再次点击按钮,引发第二次异步回送。
6、PageRequestManager实例针对第二次按钮点击引发initializeRequest事件。
7、PageRequestManager实例针对第一次按钮引发endRequest事件。
8、PageRequestManager实例针对第二次按钮点击引发beginRequest事件。
9、因第二次点击引发的请求被发送到服务器端。
10、接收到针对第二次点击的响应。
11、PageRequestManager实例引发loading事件。
12、PageRequestManager实例引发pageLoaded事件。
13、Application实例引发load事件。
14、PageRequestManager实例引发endRequest事件。

【注意】默认情况下,异步回送行为一般是最近发生的那次异步回送优先级较高。如果两个异步回送按顺序发生,并且第一个异步回送仍在浏览器处理中,则第一个回送将被取消。如果第一个回送已被发送到了服务器端,则服务器在第二个请求到来并处理它之前是不会返回第一个请求的。

(四)当用户浏览焦点脱离开本页面时引发事件的情况

当用户从本页面转向访问其它页面时,当前的页面会从浏览器中卸载;因此,这时你可以通过控件unload事件来释放有关资源。我们不妨假定当用户转向访问其它页面时存在如下情况:

◆页面中包括一个ScriptManager控件,并且该控件的SupportsPartialRendering和EnablePartialRendering属性都为true。
◆存在将转向的目标页面。

于是,下面对应发生在客户端的事件顺序:

1、初始化一个对新页面的请求;
2、浏览器获得请求新页面的响应;
3、Application实例引发unload事件;
4、显示新页面。

如果在新页面请求时发生了错误,依然会引发unload事件;只是不显示新页面罢了。

四、总结

本文中,我们使用一个具体的例子针对ASP.NETAJAX客户端生命周期中涉及的主要事件引发的顺序给出了追踪分析。但此示例显然有其特殊性且仍嫌粗略,实际开发中宜结合具体问题作针对性分析,以图从根本上掌握ASP.NETAJAX客户端生命周期中引发的主要事件先后顺序及其间的逻辑关系。