Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1811805
  • 博文数量: 272
  • 博客积分: 1272
  • 博客等级: 少尉
  • 技术积分: 1866
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-09 15:51
文章分类

全部博文(272)

文章存档

2016年(16)

2015年(28)

2014年(97)

2013年(59)

2012年(25)

2011年(47)

分类: JavaScript

2013-07-12 15:25:52

16.5  使用iframe创建智能表单

使用XMLHttpRequest对象实现Ajax功能的好处在于XMLHttpRequest对象使用简单。只需创建一个XMLHttpRequest对象,然后发送请求并等待服务器的响应。不幸的是,使用JavaScript对象具有一个弊端,即浏览器并不会在其历史记录中保存由XMLHttpRequest对象发起的HTTP请求。因此,实际上XMLHttpRequest对象使得浏览器的Back按钮功能失效了。

实现智能表单的第二个解决方案就是使用一项早期的Ajax技术,即使用隐藏框架(frame)或隐藏内嵌框架(iframe)来实现客户端/服务器之间的通信。为了正确地实现Ajax功能,必须使用两个框架页,其中,一个框架页必须是隐藏的,另一个框架页则必须是可见的。

注意:

当使用iframe来实现Ajax技术时,包含iframe的页面必须是可见的。

隐藏框架技术实现Ajax通常由4个过程组成。第一步是由用户的某种行为引发了一个对隐藏框架的请求。这包括用户单击了在可见框架页中的超链接,或者由用户的其他交互行为所引发。通常情况下,对隐藏框架页的请求仅仅是将隐藏框架页重定向到一个服务器上指定的服务端程序。对隐藏框架页的重定向将自动触发第二个过程:即向服务器发送请求。

在服务器程序完成了对请求的处理之后,将发生第三个过程:即服务器将响应发送回隐藏框架页。服务器端的响应是一个Web页面,该页面将被发送给隐藏框架。当来自服务器的响应被完全接收后,隐藏框架中的Web页面将发起与可见框架页的联系,并告知可见框架,服务器的响应已经成功。这就是第四个过程,该过程通常在隐藏框架的window.onload事件处理器中完成。

这一小节中的例子将基于前一小节中所创建的程序。但不同的是,我们将通过隐藏框架来实现浏览器与服务器之间的通信。在编写代码之前,我们先来讨论一下从服务器将返回什么样的数据。

注意:

下面的例子并不适用于Safari浏览器,Safari浏览器并不会在其历史记录中保存iframe内嵌框架的浏览历史。

服务器将如何响应请求

当我们使用XMLHttpRequest对象从服务器获取数据时,在服务器的响应中仅需要包含很少的关键字。尽管所包含的关键字可能有所不同,但是服务器的响应必须由以下两部分组成:

●       第一是必须包含响应的数据,而且该数据必须是HTML格式。

●       第二是当iframe接收到HTML形式的响应时,必须有一个机制通知父框架页中的文档。

记住这两个组成部分之后,下面我们就来构造服务器响应的HTML页面。服务器的响应将是一个HTML文件,该HTML文件具有如下的结构:

Returned <br /> Data




上面的HTML页面非常简单,在页面文档中仅包含一个

在上面有效响应页面的代码中,假定所检查的用户名是有效的。因此,在该响应页面的脚本块中,调用了父窗口中的checkUsername_callBack()函数,并将字符串available作为参数传递给checkUsername_callBack()函数。对于检查用户名或e-mail的请求,相应的响应页面将被发送回客户端。之所以要把所查找的用户名或e-mail通过响应页面发送回客户端,是为了当用户单击浏览器的Back或Forward按钮时,客户端程序能够正确地显示输入的用户名或e-mail。采用以上形式的服务器响应页面,可以使前例中的大部分代码保持不变,直接用在本例中。

使用iframe实现的智能表单与前面使用XMLHttpRequest对象的例子非常类似。而且相应的代码也只需进行少量的改动。打开文本编辑器,并输入下列代码:


Form Field Validation

Username:

Check
Availability

Email:

Check
Availability

Password:

Verify Password: