烈焰门户技术文章Ajax技术
阅读文章

Ajax和XML:五种常见 Ajax 模式

模式 1. 替换 HTML 片段

[日期: 2008-05-05 ] 来源:   作者: [字体: ]

模式 1. 替换 HTML 片段

最常见的 Ajax 任务也许就是向服务器请求更新的 HTML 并使用它更新部分页面。可能需要周期性地完成这一任务 —— 比如,更新股市报价。也可能要按需更新 —— 比如,对搜索请求进行响应。

清单 1 中的代码从服务器请求一个页面然后将内容放入页面主体的 <div> 标记中。


清单 1. Pat1_replace_div.html
<html>
<script>
var req = null;
function processReqChange() {
  if (req.readyState == 4 && req.status == 200 ) {
    var dobj = document.getElementById( 'htmlDiv' );
    dobj.innerHTML = req.responseText;
  }
}

function loadUrl( url ) {
  if(window.XMLHttpRequest) {
    try { req = new XMLHttpRequest();
    } catch(e) { req = false; }
  } else if(window.ActiveXObject) {
    try { req = new ActiveXObject('Msxml2.XMLHTTP');
    } catch(e) {
    try { req = new ActiveXObject('Microsoft.XMLHTTP');
    } catch(e) { req = false; }
  } }
  if(req) {
    req.onreadystatechange = processReqChange;
    req.open('GET', url, true);
    req.send('');
  }
}

var url = window.location.toString();
url = url.replace( /pat1_replace_div.html/, 'pat1_content.html' );
loadUrl( url );
</script>
<body>
Dynamic content is shown between here:<br/>
<div id="htmlDiv" style="border:1px solid black;padding:10px;">
</div>
And here.<br/>
</body>
</html>

清单 2 展示了代码请求的内容。


清单 2. Pat1_content.html
	
HTML encoded content goes here.

在 Firefox 中加载页面后,可以看到 图 1 所示的结果。


图 1. 替换了 <div> 标记的页面
替换了标记的页面

现在回到 清单 1 中的代码,来观察一些内容。第一个要注意的是 loadUrl() 函数,它从服务器请求一个 URL。该函数使用 XMLHTTPRequest 对象向服务器请求新内容。它还指定了一个回调函数 —— 本例中,是 processReqChange —— 当浏览器收到内容时将调用它。

processReqChange 函数将查看对象以确定请求是否完成。如果是的话,该函数将页面 <div> 标记的 innerHTML 设置为响应的文本。

<div> 标记作为一个动态内容的占位符,这是 Ajax 代码的主要组成部分。这些标记没有可见的表示形式(除非添加边框,像我这样做),但它们很好地标记了内容的放置位置。工程师还使用 <span> 标记用于可代替的片段,稍后我将对其进行演示。<div><span> 标记的不同之处是前者加入了一个断行符(如一个段落),而后者使用边线勾画出一节内联文本。

暂时回到 processReqChange 函数,该函数对 statusreadyState 的值进行检查非常重要。有些浏览器可能只在请求完成时才调用这个函数,而也有些浏览器会不断回调该函数从而告诉代码请求依然在运行。

选项卡式显示变体

该模式的另一种变体就是创建一个选项卡样式的显示。 清单 3 展示了一个简单的选项卡式 Ajax 界面。


清单 3. Pat1_tabs.html
<html>
<script>
var req = null;
function processReqChange() {
  if (req.readyState == 4 && req.status == 200 ) {
    var dobj = document.getElementById( 'tabDiv' );
    dobj.innerHTML = req.responseText;
  }
}

function loadUrl( tab ) {
  var url = window.location.toString();
  url = url.replace( /pat1_tabs.html/, tab );
  ...
}

function tab1() { loadUrl( 'pat1_tab1_content.html' ); }
function tab2() { loadUrl( 'pat1_tab2_content.html' ); }
tab1();
</script>
<body>
<a href="javascript: void tab1();">Tab 1<a> 
<a href="javascript: void tab2();">Tab 2<a>
<div id="tabDiv" style="border:1px solid black;padding:10px;">
</div>
</body>
</html>

清单 4 显示了第一个选项卡的内容。


清单 4. Pat1_tab1_content.html
Tab 1 content

清单 5 显示了第二个选项卡的内容。


清单 5. Pat1_tab2_content.html
Tab 2 content

当我在自己的浏览器上显示该页面时,我看到了第一个选项卡,如 图 2 所示。


图 2. 第一个选项卡的内容
第一个选项卡的内容

然后单击第二个选项卡的链接。浏览器检索第二个选项卡的内容然后将它显示在选项卡区域,如 图 3 所示。


图 3. 第二个选项卡的内容
第二个选项卡的内容

这是该设计模式的最典型用法 —— 从用户那里获得请求并使用新的内容更新部分显示,本例演示了创建选项卡显示的技巧。应用程序端的价值就是您可以为用户下载非常轻量级的页面,用户可以根据自己的需求访问这些内容。

在 Ajax 出现之前,最常见的技术是将所有的选项卡都放在页面上,然后根据需要显示或隐藏它们。这就是说即使从来不查看第二个选项卡,也会为其创建 HTML,既浪费服务器时间又浪费带宽。使用这种新的 Ajax 方法,只有当用户请求第二个选项卡时才会为其创建 HTML。

read more 变体

该模式的另一个变化就是 Read more 链接,如 图 4 所示。


图 4. 我的博客登录处的 Read more 链接
Read more 链接

假如想希望阅读更多关于我遛狗的经历,可以单击 Read more 链接,使该链接替换为完整的故事,如 图 5 所示。


图 5. 单击 Read more 链接后显示的页面
单击 Read more 后

这样做的好处是顾客可以在无需刷新页面的情况下获得更多内容。

清单 6 显示了该页的代码。


清单 6. Pat1_readmore.html
<html>
<script>
var req = null;
function processReqChange() {
  if (req.readyState == 4 && req.status == 200 ) {
    var dobj = document.getElementById( "moreSpan" );
    dobj.innerHTML = req.responseText;
  }
}

function loadUrl( url ) { ... }

function getMore()
{
  var url = window.location.toString();
  url = url.replace( /pat1_readmore.html/, 'pat1_readmore_content.html' );
  loadUrl( url );
}
</script>
<body>
<h1>Walking the dog</h1>
I took my dog for a walk today. 
<span id="moreSpan">
<a href="javascript: void getMore()">Read more...</a>
</span>
</body>
</html>

清单 7 显示了 “read more” 部分的内容。


清单 7. Pat1_readmore_content.html
It was a nice day out. Warm and sunny. My dog liked getting out for a stretch.

这些代码演示的是 <span> 标记的用法,而非 <div> 标记。所使用的方法取决于用户界面(UI)的需求。但是正如您所看到的那样,无论哪种方法使用起来都很简单。

为页面获取新的 HTML 只是其中一件事情,如果您希望 JavaScript 代码在页面中使用数据执行一些更智能化的任务该怎么办呢?如何使用结构化的方式将数据发送到浏览器呢?毫无疑问,这正是使用 XML 的原因。

上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页   
阅读:
录入: ☆我就‰喜欢☆ 打印 错误报告
上一篇: 实例讲解Silverlight与AJAX的融合
下一篇: AJAX 核心三部曲
相关文章
本文评论(点击查看所有评论
发表评论
希望 寒冷 强悍 惊讶 开心 吃饭 恭喜 流泪 爱你 啊困 心碎
偷笑 咒骂 流汗 大哭 求爱 装酷 砖头 头晕 出气 呲牙 吸烟

点评:


  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规!
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任!
  • 本站管理人员有权保留或删除其管辖留言中的任意内容!
  • 本站有权在网站内转载或引用您的评论!
  • 参与本评论即表明您已经阅读并接受上述条款!
关于烈焰网 | 意见投诉 | 网站地图 | 联系方式 | Ajax技术
Copyright © 烈焰门户 www.Jvqq.Net.Cn All Rights Reserved 京ICP备07022601号