在该例中,我让浏览器从服务器上下载一个图像列表。然后使用动态 HTML(DHTML)把图片列表组成一个幻灯片。我使用随机的缓慢移动、缩放和渐变来改变图片,实现了令人满意的 Ken Burns Effect 版本,而不需要下载 Macromedia® Flash 或其他重量级的动画工具。
体系结构 要了解 Ajax 有何不同,首先必须理解当前的 Web 编程模型。客户机和服务器之间的简单交互如 图 1 所示。
图 1. 客户机-服务器交互的 Web V1.0 模型
Web 浏览器或者客户机 向 Web 服务器发出 GET 或 POST 请求。服务器格式化 HTML 响应。客户机解析 HTML 并显示给用户。如果用户单击其他链接和按钮,就向服务器发出另一个请求,用服务器返回的新页面替换当前页面。
新模型具有更多的异步特色,如 图 2 所示。
图 2. 客户机-服务器交互的 Ajax 模型
在新的模型中,和以前一样,服务器也返回 HTML 页面。但是这个页面中有一些 JavaScript代码。在需要的时候,这些代码向服务器请求更多信息。这些请求可以是简单的 GET 请求(Representational State Transfer (REST) 服务)或者 POST 请求(SOAP)。
然后,JavaScript 代码解析响应(通常用 XML 编码)并动态更新页面以反映新的数据。除了 XML 外,还返回 JavaScript Serialized Object Notation(JSON)格式编码的数据。浏览器很容易理解这类数据,但其他类型的客户机则不行。返回 XML 的意义在于浏览器之外的其他客户机也能解释数据。选择由您来决定并依赖于具体的应用程序。
<script> function processReqChange() { if (req.readyState == 4 && req.status == 200 && req.responseXML != null) { var dto = document.getElementById( 'dataTable' );
var items = []; var nl = req.responseXML.getElementsByTagName( 'slide' ); for( var i = 0; i < nl.length; i++ ) { var nli = nl.item( i ); var src = nli.getAttribute( 'src' ).toString(); var width = parseInt( nli.getAttribute( 'width' ).toString() ); var height = parseInt( nli.getAttribute( 'height' ).toString() );
var sx = ( nw * this.sx ); var ex = ( nw * this.ex ); var sy = ( nh * this.sy ); var ey = ( nh * this.ey ); var dx = ( ex - sx ) / 100; var dy = ( ey - sy ) / 100; var x = cntw + sx + ( dx * percent ); var y = cntw + sy + ( dy * percent );
var ii = new ImageInfo( img.src, img.width, img.height, imgObj );
var szoom = rnd( 50, 100 ); var ezoom = rnd( 70, 120 );
var d = parseInt( ( Math.random() * g_directions.length ).toString() ); var di = g_directions[ d ]; var sx = rnd( di.sx[0], di.sx[1] ); var sy = rnd( di.sy[0], di.sy[1] ); var ex = rnd( di.ex[0], di.ex[1] ); var ey = rnd( di.ey[0], di.ey[1] );
g_slides.push( new Animation( g_animationManager, ii, 10, [ new KenBurnsZoomer( ii, szoom, ezoom, ic.clientWidth, ic.clientHeight ), new KenBurnsMover( ii, sx, sy, ex, ey, ic.clientWidth, ic.clientHeight ), new KenBurnsFader( ii, 30 ) ] ) ); } }
function start_slides() { g_slides[ g_current_slide ].start(); } </script> </head> <body>