Ajax 和 XML: 用于表格的 Ajax

使用 Ajax 构建表格、选项卡和滑动块

Asynchronous JavaScript + XML (Ajax) 的一个强大功能是以动态方式向用户显示来自服务器的数据。使用表格、选项卡和滑动块等技术,探索将 Ajax 用于动态数据显示的多种技巧。

访问 Ajax 技术资源中心,developerWorks 上所有有关 Ajax 的问题都可以在这里找到解答。

Jack D. Herrington, 高级软件工程师, Leverage Software Inc.

Jack D. Herrington 是一位有着超过 20 年经验的高级软件工程师。他是 Code Generation in ActionPodcasting Hacks PHP Hacks 这三本书的作者。他还发表了 30 多篇文章。可以通过 jherr@pobox.com 与 Jack 联系。



2008 年 4 月 02 日

当人们想到 Ajax 和 Web 2.0 时,他们通常会想起用户体验中的可视元素。它给人的感觉是工作良好, 无需页面刷新,这使 Ajax 特别引人关注。传统 HTML 应用程序的页面刷新会导致页面的闪烁并且需要重新加载,就是拥有最快的连接速度,也能够发现上下文的变化。

常用的缩写词

  • DHTML:动态 HTML
  • HTML:超文本标记语言
  • XSLT:可扩展样式表语言转换

在本文中,我将介绍多种技巧 — 包括使用 Ajax 和不使用的技巧 — 演示了用户体验设计中自由改变上下文的方法。我将从最简单的 Ajax 用户体验示例(即选项卡式窗口)开始。

选项卡式窗口

选项卡是将大量数据放置在相对少量的固定区域中的最简单方法。并且优秀的 Prototype.js JavaScript 库使得在动态 HTML (DHTML) 中构建支持 Ajax 的选项卡式窗口非常容易,如 清单 1 所示。要了解有关 Prototype 库的更多信息并下载它的副本以供使用,请参阅 参考资料

清单 1. index.html
<html>
<head>
<script src="prototype.js"></script>
</head>
<body>
<a href="javascript:void loadTab( 'tab1.html' )">Tab 1</a> |
<a href="javascript:void loadTab( 'tab2.html' )">Tab 2</a> |
<a href="javascript:void loadTab( 'tab3.html' )">Tab 3</a>
<div id="content" style="padding:5px;border:2px solid black;">
</div>
<script>
function loadTab( tab ) { 
  new Ajax.Updater( 'content', tab, { method: 'get' } );
}
loadTab( 'tab1.html' );
</script>
</body>
</html>

在该文件的顶部,我包含了 Prototype.js 库,它处理所有 Ajax 工作。然后,您会看到一个到各个页面的链接列表,每个链接都调用 loadTab 来更新页面的内容区域。内容区域是一个 <div>,其 ID 为 contentloadTab 函数 调用 Ajax.Updater 来用指定的 HTML 文件更新内容 <div>

清单 2 显示第一个选项卡 HTML 文件。所有其他文件 都类似于该文件。

清单 2. tab1.html
Tab 1

当我在自己的浏览器中浏览该文件时,我看到类似 图 1 的某些内容。

图 1. 初始选项卡页
初始选项卡页

然后,当我单击第二个选项卡时,我会看到如 图 2 所示的内容。

图 2. 单击第二个选项卡之后
单击第二个选项卡之后

选项卡式窗口的现场演示

要在真实的环境中查看选项卡式窗口示例,请打开链接以在新的窗口中观看选项卡式窗口的现场演示观看此在线演示

您可以通过对内容使用隐藏的 <div> 标签,然后关闭其可见性来实现此功能。此 Ajax 方法的优势在于仅在必要时创建和加载内容。因此,如果用户选择不查看内容,则构建内容的计算时间将会减少或消除。

下面的三个示例是使用 Ajax 技巧(或类似于 Ajax 的某种技术)处理表格的所有方法。


使用 Ajax 的基本表格

我的第一个使用 Ajax 构建表格的演示是,通过 Ajax 向服务器发送 XML 请求,此技巧的价值是双重的。首先,它根据需要加载数据,并且可以适当地更新,这使得用户体验非常愉快。其次,该技巧需要一个 XML 数据源,该数据源不仅对 Ajax 代码有用,它对于希望通过 XML 使用您的数据的任何客户端都非常有价值。

清单 3 显示了 XML 驱动的表格示例代码。

清单 3. index.html
<html>
<head>
<script src="prototype.js"></script>
</head>
<body>
<table id="books">
</table>
<script>
new Ajax.Request( 'books.xml', { 
  method: 'get',
  onSuccess: function( transport ) {
    var bookTags = transport.responseXML.getElementsByTagName( 'book' );

    for( var b = 0; b < bookTags.length; b++ ) {
      var author = bookTags[b].getElementsByTagName('author')[0].firstChild.nodeValue;
      var title = bookTags[b].getElementsByTagName('title')[0].firstChild.nodeValue;
      var publisher = 
          bookTags[b].getElementsByTagName('publisher')[0].firstChild.nodeValue;

      var elTR = $('books').insertRow( -1 );
      var elTD1 = elTR.insertCell( -1 );
      elTD1.innerHTML = author;
      var elTD2 = elTR.insertCell( -1 );
      elTD2.innerHTML = title;
      var elTD3 = elTR.insertCell( -1 );
      elTD3.innerHTML = publisher;
    }
  }
} );
</script>
</body>
</html>

使用 Ajax 的基本表格的现场演示

要在真实环境中查看基本表格示例,请打开链接以在新的窗口中观看基本表格的现场演示观看此在线演示

Ajax.Request 调用的 onSuccess 处理程序首先获取每个 book 元素,分解 XML 数据。然后,它从嵌入的标签中获取 authortitlepublisher 值。最后,它对每个 book 使用 insertRowinsertCell 将数据添加到表格中。

清单 4 显示了本示例的 XML 代码。

清单 4. books.xml
<books>
  <book>
    <author>Jack Herrington</author>
    <title>Code Generation In Action</title>
    <publisher>O'Reilly</publisher>
  </book>
  <book>
    <author>Jack Herrington</author>
    <title>Podcasting Hacks</title>
    <publisher>O'Reilly</publisher>
  </book>
  <book>
    <author>Jack Herrington</author>
    <title>PHP Hacks</title>
    <publisher>O'Reilly</publisher>
  </book>
</books>

图 3 显示了生成的 DHTML 文件。

图 3. XML 驱动的表格页
XML 驱动的表格页

本示例非常适合于小型结果集,但对于较大的结果集会怎样呢?


使用 Ajax 的分页表格

为了使用 Ajax 创建分页表格,我介绍一种稍有不同的技巧。这并不是因为 我必须使用这种技术 — 我可以轻松扩展上述 XML 技巧 — 但我希望本文中的这些示例可以向您展示各种技巧,您可以从中选择适合您的应用程序需求的技巧。

在本例中,我使用一个 PHP 数据源,该数据源提供了分页表格的各个页面的 HTML 代码块。此 HTML 代码以 清单 5 开始。

清单 5. index.html
<html>
   <head>
   <script src="prototype.js"></script>
   </head>
   <body>
   <div>
   <a href="javascript:void updateTable(0);">1</a> |
   <a href="javascript:void updateTable(1);">2</a> |
   <a href="javascript:void updateTable(2);">3</a> |
   <a href="javascript:void updateTable(3);">4</a> |
   <a href="javascript:void updateTable(4);">5</a> |
   <a href="javascript:void updateTable(5);">6</a>
   </div>
   <div id="states">
   </div>
   <script>
   function updateTable( start ) {
      new Ajax.Updater( 'states', 'stats.php?start='+(start*10)+'&count=10', 
      { method: 'get' } );
   }
   updateTable( 0 );
   </script>
   </body>
</html>

大多数页面都位于指向表格的各种页面的链接中。然后,states <div> 标签收到来自 stats.php 页面的表格内容。

为了运行多页面的示例,我需要一个较大的数据集,因此我找到了一些美国人口统计信息并创建了一个 PHP 函数 getdata,该函数返回一个数组,其中包含这些年来各个州及其人口。清单 6 显示了该函数的一段摘录。

清单 6. data.php
<?php
function getdata()
{
   $population = array();
   $population []= 
       array( 'Alabama',4447100,4527166,4596330,4663111,4728915,4800092,4874243 );
   $population []= array( 'Alaska',626932,661110,694109,732544,774421,820881,867674 );
...
   $population []= array( 'Wyoming',493782,507268,519886,528005,530948,529031,522979 );
   return $population;
}
?>

现在,为了获得数据的各个部分,我创建了一个 stats.php 页面,该页面提供了一个开始和结束索引, 返回一个只包含该部分数据的 HTML 表格。清单 7 显示了该文件。

清单 7. stats.php
<table>
<?php
require 'data.php';
   $data = getdata();
   $start = 0;
$count = count( $data );
   if ( array_key_exists( 'start', $_GET ) ) $start = $_GET['start'];
if ( array_key_exists( 'count', $_GET ) ) $count = $_GET['count'];
   $index = 0;
foreach( $data as $state ) {
if ( $index >= $start && $index < $start + $count ) {
?>
<tr>
<?php
foreach( $state as $item ) {
?>
<td><?php echo($item); ?></td>
<?php
}
?>
</tr>
<?php
}
$index += 1;
}
?>
</table>

当我在自己的浏览器中浏览该页面时,如 图 4 所示,它将自动加载第一个页面。

图 4. 分页表格显示
分页表格显示

当我单击表格的各个部分时,stats.php 中的表格会动态地加载。图 5 显示了当我单击数据的第二页时发生的情况。

图 5. 分页表格显示的第二页
第二页

使用 Ajax 的分页表格的现场演示

要在真实环境中查看页面表格示例,请打开链接以在新窗口中观看分页表格的现场演示观看此在线演示

该技巧类似于我对选项卡所使用的技巧。通过 Ajax 传递 HTML 通常与 XML 一样有效。并且更容易在浏览器上实现,因为 XML 不需要被解析并再次转换回 HTML。

我演示的第三种表格构建技巧是动态构建表格的最容易的非 Ajax 方法。


隐藏的分页表格

清单 8 中的页面显示了在没有 Ajax 作为后端的情况下创建分页表格的一种简单技巧。

清单 8. index.php
<html>
<head>
<script src="prototype.js"></script>
</head>
<body>
<div>
<?php
require( 'data.php' );

$data = getdata();
$states = count( $data ) / 10;

for( $s = 0; $s < $states; $s++ ) {
?>
<?php echo( ( ( $s == 0 ) ? '' : '| ' ) ); ?>
<a href="javascript:void updateTable(<?php echo( $s ) ?>);">
      <?php echo( $s + 1 ) ?>
</a>
<?php
}
?>
</div>

<?php
$index = 0;
foreach( $data as $state ) {
?>
<?php
if ( $index % 10 == 0 ) {
?>
<?php if ( $index > 0 ) { ?></table></div><?php } ?>
<div id="states<?php echo( $index / 10 ) ?>" style="display:none;">
<table>
<?php 
}
?>
<tr>
<?php
foreach( $state as $item ) {
?>
<td><?php echo($item); ?></td>
<?php
}
?>
</tr>
<?php
$index += 1;
}
?>
</table>
</div>

<script>
function updateTable( id )
{
  var elStateDivs = [];
<?php
for( $s = 0; $s < $states; $s++ ) {
?>
  elStateDivs.push( $( 'states<?php echo( $s ) ?>' ) );
<?php
}
?>
  for( var i = 0; i < elStateDivs.length; i++ ) {
    if ( i == id ) elStateDivs[i].show();
    else elStateDivs[i].hide();
  }
}

updateTable( 0 );
</script>

</body>
</html>

在本例中,我使用 PHP 代码创建了一系列 <div> 标记 — 一个标记用于表格中的一个页面。默认情况下显示第一个标记,而隐藏其他标记。updateTable 函数根据选择的页面显示或隐藏表格的各个部分。

隐藏的分页表格的现场演示

要在真实环境中查看隐藏的分页表格示例,请打开链接以在新窗口中观看隐藏的分页表格的现场演示观看此在线演示

注意,我仍然包含了 Prototype.js 库 — 并非因为 Ajax 支持。我只是希望使用以下方法更容易获得每个 <div> 元素:$() 方法以及 showhide 方法,所有这些方法都能够由这个库来实现。

图 6 显示了这个页面。

图 6. 模拟页面表格显示
模拟页面表格显示

最后一个 Ajax 示例显示了一个滑动块控件。滑动块 是一种新的显示形式, 当显示的页面发生变化时,它会提供动态的左/右运动。


滑动块

为了启用滑动块效果,我需要另外几个库。第一个库是 Scriptaculous 库,该库构建在 Prototype.js 之上。它提供滑动块使用的效果。第二个库是 Glider 库。

清单 9 显示了一个滑动块示例。

清单 9. index.html
<html><head>
<link rel="stylesheet" href="stylesheets/glider.css" type="text/css">
<script src="javascripts/prototype.js"></script>
<script src="javascripts/effects.js"></script>
<script src="javascripts/glider.js"></script>
</head><body>
<div id="glider"><div class="controls">
<a href="#tab1">Tab 1</a> | 
<a href="#tab2">Tab 2</a> |
<a href="#tab3">Tab 3</a> |
<a href="#tab4">Tab 4</a></div>
<div class="scroller"><div class="content">
<div class="section" id="tab1">Tab 1</div>
<div class="section" id="tab2">Tab 2</div>
<div class="section" id="tab3">Tab 3</div>
<div class="section" id="tab4">Tab 4</div>
</div></div></div>
<script>
new Glider( 'glider', { duration:0.5 } );
</script>
</body></html>

滑动块效果的现场演示

要在真实环境中查看滑动块示例,请 打开链接以在新窗口中观看滑动的现场演示观看此在线演示

在该文件的顶部包含了各种脚本库。然后还有滑动块 <div>,它包含一个名为 controls<div> 和一个名为 scroller<div>,前者具有指向每个选项卡的锚标签 ,而后者包含每个选项卡的内容。底部的脚本创建一个 Glider 对象,该对象具有滑动块 <div> 元素的 ID。

当我在自己的浏览器中打开此页面时,我看到类似于 图 7 所示的内容。

图 7. 使用滑动块实现的选项卡示例
使用滑动块实现的选项卡示例

当我单击另一个选项卡时,内容便逐字地向其滑动。


结束语

在本文中,我介绍了一些不同类型的界面元素,它们可以使用 Ajax、PHP 和 Prototype.js 库构建。希望您能够采纳其中的一些建议,并将其用于您自己的 Web 应用程序。它们非常容易,并且 Prototype.js 库确实使 Ajax 更加灵活。如果您愿意分享您的成功经历,请加入 developerWorks Ajax 论坛:我们非常愿意倾听您的建议。

参考资料

学习

  • 您可以参阅本文在 develperWorks 全球网站上的 英文原文
  • Ajax 技术资源中心:developerWorks 上所有有关 Ajax 的问题都可以在这里找到解答。
  • PHP 主页:为 PHP 程序员提供了宝贵的资源。
  • Prototype 库:了解这个用于简化动态 Web 应用程序开发的 JavaScript Framework。
  • Scriptaculous JavaScript 库:查找一些显示帮助器和特效,使用这个基于 Prototype 的框架改善您的 Web 站点。
  • Prototype.js 文档页:访问官方 Prototype blog 和其他很多资源的链接,获得关于 Prototype JavaScript 库的更多信息。
  • jQuery:探索另一个 JavaScript 库,它提供了与 Prototype.js 类似的功能。
  • Yahoo! User Interface Library:查看 Yahoo! 的 Ajax 工具箱。
  • 滑动块控件:在选项卡样式的交互操作上添加新特性。
  • IBM XML 认证:了解如何才能成为一名 IBM 认证的 XML 及相关技术的开发人员。
  • XML 技术库:developerWorks XML 专区,获取大量技术文章和技巧、教程、标准和 IBM 红皮书。
  • developerWorks 技术事件和网络广播:随时关注这些领域的技术进展。
  • The 技术书店 :浏览有关这些以及其他技术主题的书籍。

获得产品和技术

  • IBM 试用版软件:使用可直接从 developerWorks 下载的试用版软件构建您的下一个开发项目。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Web development
ArticleID=299241
ArticleTitle=Ajax 和 XML: 用于表格的 Ajax
publish-date=04022008