【发布时间】:2010-10-10 18:54:17
【问题描述】:
我正在使用 ASP.NET AJAX,想了解这两个 sn-ps 之间的区别:
function pageLoad(sender, eventArgs) { }
和
window.onload = function() { }
- 它们的行为是否相同?
- 还是先调用一个?
- 或者一个会被自动调用而另一个不会?
【问题讨论】:
标签: .net asp.net javascript asp.net-ajax
我正在使用 ASP.NET AJAX,想了解这两个 sn-ps 之间的区别:
function pageLoad(sender, eventArgs) { }
和
window.onload = function() { }
【问题讨论】:
标签: .net asp.net javascript asp.net-ajax
首先要注意几点。 MS 发明了一种名为Sys.Application 的“客户端运行时对象”。它在整个页面的 [clientside] 生命周期内处理引发 init、load 和 unload 事件,如下所示:
Sys.Application.initialize() 开始生命周期的 init 部分。这initialize()s 所有客户端 AJAX 控件,之后它们就可以以编程方式进行交互了Sys.Application 开始生命周期的 load 部分,调用所有订阅此事件的处理程序pageLoad(如果定义了)对每个部分(即 AJAX + UpdatePanel)回发重复步骤 2) 和 3)。
所以最终答案:pageLoad 只是到Sys.Application.add_load() 的方便快捷方式。
然而,关于它与window.onload 的关系,事情开始变得有趣起来。本质上,MS 需要window.onload 仅在init 阶段完成之后触发。但是您无法控制浏览器何时触发onload,因为它与“已加载内容” 相关联。这被称为"the window.onload problem":
onload 事件在所有页面后触发 内容已加载(包括图像 和其他二进制内容)。如果你的 页面包含很多图像然后你 之前可能会看到明显的滞后 页面变为活动状态。
因此,他们只是发明了自己的“特殊”功能,以便在事件生命周期的正确时间触发,并将其命名为 "pageLoad"。他们用来启动这个自定义事件生命周期的技巧是place the call to Sys.Application.initialize() just before the closing </form> tag。服务器端运行时执行此操作。精明的读者会注意到,这个技巧让 MS 解决了 window.onload 问题,因为您放入 pageLoad 的任何代码都将独立于二进制内容 (w/ one rare catch for IE) 触发。
>他们的行为是否相同?
从概念上讲是的,实际上根本不是由于所说的window.onload 问题。唯一的规则是您应该只将与您的 AJAX 控件交互的代码放在 pageLoad 中,因为 window.onload 遵循自己的事件轨迹。
> 还是先调用一个?
他们完全、100% 独立。
> 或者一个会被自动调用而另一个不会?
如果你定义了它们,它们都会被调用。
【讨论】:
</form> 结束标记之前调用)实际上是天才。它允许将 ASP 页面生命周期与可怕的、依赖于浏览器的事件分开。这也是为什么现在如此容易构建的原因,即使用纯 JavaScript 显示/隐藏或动画等特定元素的完整服务器端警报 API。他们已经完成了 fantastic 的工作,因此我们可以从服务器端事件中执行我们想要的 任何 JS 代码。 ♥ x100