开发人员使用 js 代码的另一个主要原因是避免回传。考虑 TreeView 控件,用户能随意展开或收合节点。展开节点时,TreeView 通过 JavaScript 从服务器获取子节点的信息并插入新节点。没有 JavaScript,页面就只能回传以重建 TreeView。用户会看到略微缓慢的延迟,页面甚至可能重新滚动回到开始,在服务器端需要浪费大量时间序列化和反序列化每个回传的视图状态信息。
如何避免这种额外的负载以及如何使用一点 js 创建更平滑、更简单的页面?自包容的 js 作为独立任务实现,不需要和页面模型的其他部分交互,例如一个弹出信息或者滚动状态显示。然而,如果希望创建像 TreeView 那种真正动态的页面,会发生什么呢?
它调用服务器端的方法,等候响应,动态的插入新信息,而这一切都不触发页面回传。要设计这样的解决方案,你需要让客户端脚本和服务器端代码通信。
Ajax 简介
Ajax(Asynchronous JavaScript and XML),它是一种具有特定特征的 JavaScript 程序。Ajax 风格的页面在后台与服务器通信,请求额外的信息。客户端代码获得这些信息后,执行额外的动作。
例如,使用 Ajax 技术可以抓取实时的股票报价并刷新页面的一个区域而不需要触发回传。客户端和服务器端的通信是异步的,因此客户端不会被打扰。具有更好的响应性以及平滑的浏览体验,这些都不需要刷新。
Ajax 的页面编程可能很复杂,这不是因为 JavaScript 技术特别难(它们并不难),而是因为有时需要复杂的变通方案来确保浏览器的兼容性。理想下,ASP.NET 程序员根本不需要操心编写 Ajax 风格的页面。相反,应该使用服务器端的高级框架,它们可以注入你需要的 js 代码。但这一目标目前进展很慢,毕竟,微软需要时间仔细考虑把这些客户端功能整合到 ASP.NET 服务器端模型的各种方案。
XMLHttpRequest 对象
XMLHttpRequest 对象是 Ajax 的基石。XMLHttpRequest 令人不可思议的有用,又难以置信的简单。它能以文本的形式向服务器发送异步请求并以文本的形式获得结果,而请求什么、返回什么则由你来决定。
尽管现代浏览器对 XMLHttpRequest 对象有广泛的支持,但是它们对如何访问这个对象还是有细微差别的。IE7、Firefox、Safari、Opera 将 XMLHttpRequest 对象作为本地 JavaScript 对象实现的。而在 IE7 之前的浏览器中,XMLHttpRequest 对象是作为 ActiveX 对象实现的。
因为这些差别,js 代码在创建 XMLHttpRequest 对象的实例时,必须要有足够的智能来采用正确的方式。这是微软为客户端回调功能实现这一任务的 js 代码:
try
{
xmlRequest = new XMLHttpRequest();
}
catch (err)
{
xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
}