第21章 页面局部更新

21.1. 什么是页面局部更新
21.2. OperaMasks 3.2中的局部更新
21.2.1. 同表单自动更新
21.2.2. 注册跨表单更新
21.2.2.1. 在页面中注册更新
21.2.2.2. 使用API方式注册局部更新
21.2.2.3. 使用ajax:updater进行重画刷新
21.2.2.4. 使用构件类上repaint方法进行重画刷新
21.3. OperaMasks 3.0与2.3版本局部更新策略比较

21.1. 什么是页面局部更新

页面局部更新,是AJAX技术为Web应用带来的一个具有重大意义的能力。异步提交与局部更新,构成了AJAX技术的两大技术支撑特性。所谓局部更新,顾名思义,就是每次网页的提交与响应,不会导致整个页面重新刷新,而只是更新页面中与这次提交所产生的结果相关的局部内容。有了局部更新,客户端浏览器就能相对来说更为频繁地与服务器端进行交互,在不中断用户操作流程和只占用少量带宽的前提下,为用户提供及时的服务器端反馈信息。更重要的是,由于不需要整体刷新页面,每次局部更新不会破坏浏览器脚本的运行期上下文环境,使得在浏览器上存在一个相对复杂的基础框架成为可能。这个基础框架(或称AJAX框架)只需要在页面首次载入时被加载和初始化一次,后续的局部刷新,可以通过框架所提供的轻量级的API进行,而无须重新加载。这类框架相信大家已经耳熟能详了,比如Ext-JS,JQuery,Prototype等等。

从本质上看,页面的局部更新归根结底是通过客户端脚本(JavaScript)操作浏览器DOM树结点来实现的,但是,在引入了上文所提到的客户端基础框架后,情况就变得稍微复杂了,从局部更新的内容与实现方式来看,可以简单分为以下几类:

  • 页面构件值的更新

    在Web应用中,构件的当前取值是经常发生变动的,是局部更新的主要对象,因此无论是HTML的标准表单构件还是一些由客户端框架提供的富客户端构件(例如标准HTML的INPUT构件和Ext-js的TextField构件等,下文统称客户端构件对象),都为更新构件值提供了非常轻量快捷的API。因此对于需要更新构件值的场景,我们通常会直接调用对应的客户端构件对象的API,既省带宽,效率也高。

  • 构件数据模型的更新

    对于一些比较复杂的构件,除了当前的取值之外,还会带有一个较为复杂,但相对稳定的数据模型,例如下拉框(Combo)的下拉列表,或是多选框组(CheckBoxGourp)的选项列表等等。根据被更新对象的不同,数据模型的改变可能需要替换DOM结点,或刷新客户端构件的数据存储对象,而且需要在网络上传递较多的数据模型信息,相对来说,性能比单纯的值更新要低。

  • 具有轻量级API的构件属性更新

    大部分由客户端框架提供的构件,对于一些会经常发生变动的属性,框架提供了类似构件值的API更新机制(例如title、disabed、style等)。这类属性我们称为“轻量级属性”。对于这类属性,我们也可以直接调用客户端构件API实现更新。但由于这些轻量级属性的展现效果通常是由客户端框架实现,逻辑上可能比较复杂,因此更新性能平均来说比构件值更新要略低。

  • 局部重画更新

    对于那些不会经常变动的客户端构件属性,客户端框架出于稳定性和性能考虑,往往不提供运行期动态更新的API,而需要对构件重新进行初始化和渲染才能生效。另一种情况是,如果在AJAX请求中增加、删除或更换了页面上的构件,那么就必须把有关区域的整个DOM子树删除,再重新构造。这种方式,我们称为局部重画。局部重画是通过替换DOM模型子树来实现的,并且客户端框架需要对重画的构件进行重新初始化和渲染,性能是上述几种方式中最慢的。

如果要写出性能优良,少占带宽的AJAX应用,开发者们通常只能看菜吃饭量体裁衣,根据更新内容的具体类型选用合适的更新方式。为了减轻开发者的负担,提高开发效率,OperaMasks 3.2对局部更新的编程模型进行了大幅简化,在最常见的“同一表单内构件值更新”的场景中,开发者甚至可以完全不用关心局部更新的问题。而对于其他的一些特殊场景,OperaMasks 3.2也提供了便利的解决方案。下面,我们来具体看一看OperaMasks 3.2中的局部更新编程方式。