ASP.NET AJAX的pageLoad()和JavaScript的window.onload有什么区别?

18

我正在使用ASP.NET AJAX,并想了解这两个代码片段之间的区别:

function pageLoad(sender, eventArgs) { }
并且
window.onload = function() { }
  • 它们的功能相同吗?
  • 或者其中一个会在另一个之前被调用?
  • 或者其中一个会自动被调用而另一个不会?
1个回答

42
首先需要注意的是,微软发明了一种称为 Sys.Application 的“客户端运行时对象”。它处理页面在客户端生命周期内引发的 initloadunload 事件,具体如下:
  1. Sys.Application.initialize() 开始生命周期的 init 部分。这个函数会初始化所有客户端 AJAX 控件,之后就可以通过编程方式与它们交互了。
  2. Sys.Application 开始生命周期的 load 部分,调用所有已订阅此事件的处理程序。
  3. 最后,如果定义了全局函数 pageLoad,则调用该函数。
步骤 2 和 3 将针对每个部分(即 AJAX + UpdatePanel)的回传重复执行。 所以最终的答案pageLoad 只是一个方便的快捷方式,可替代 Sys.Application.add_load()

在与window.onload的关系方面,事情开始变得有趣。基本上,微软需要window.onload仅在init阶段完成后才触发。但是,您无法控制浏览器何时触发onload,因为它与“内容加载”相关。这就是所谓的"window.onload问题"

当所有页面内容(包括图像和其他二进制内容)都已加载时,onload事件才会触发。如果您的页面包含大量图像,则页面变为活动状态之前可能会出现明显的延迟。

所以,他们只是发明了自己的“特殊”功能,在事件生命周期中恰当的时间触发并称之为“pageLoad”。而启动此自定义事件生命周期的技巧是将调用Sys.Application.initialize()放在关闭的</form>标签之前。这是由服务器端运行时完成的。敏锐的读者会注意到,这个技巧允许MS解决window.onload问题,因为你放入pageLoad的任何代码都将独立于二进制内容触发(唯一一个IE的罕见异常)。

> 它们的作用相同吗?

从概念上讲,是的,但实际上不是完全相同,因为存在window.onload问题。唯一的规则是只在pageLoad中放置与您的AJAX控件交互的代码,因为window.onload遵循其自己的事件轨迹。

> 或者一个先调用,另一个后调用?

它们是完全独立的,百分之百无关。

> 或者其中一个被自动调用而另一个没有?

如果你定义了它们,它们都会被调用。


1
你的回答是完整的,但我有一个关于pageLoad的问题,当我把它放在我的页面上时,我发现它会自动地一直被调用,注意:我在页面上有telerik:RadAjaxManager,所以这是因为出现了错误还是正常的一直被调用“因为它是由计时器调用的”? - Amr Elgarhy
1
不错的写作 +1 - </form> 解决方案非常可笑地微软化了 - annakata
@amrelgarhy:请查看我的更新答案:步骤2和3将在每次部分(即AJAX + UpdatePanel)回发时调用。 - Crescent Fresh
@crescentfresh:+1。你为什么删除了你的另一个答案?它基本上是一样的。看起来很困惑 - Tomalak
1
@annakata 这个解决方案(在 </form> 结束标签之前放置调用)实际上是天才。它允许将 ASP 页面生命周期与可怕的、依赖于浏览器的事件分离开来。这也是为什么现在很容易构建完整的服务器端警报 API,该 API 使用纯 JavaScript 来显示/隐藏或动画等特定元素的原因。他们做得非常好,由此我们可以从服务器端事件执行 任何 JS 代码。♥ x100 - Skipper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接