张银的博客


Eat to live, but do not live to eat.

导航

AJAX 高级(一)

Posted on 2009-07-17 11:27  张银  阅读(344)  评论(0编辑  收藏  举报

AJAX 请求实例

我们已看到 AJAX 可被用来创建更多交互性的应用程序。

AJAX Suggest实例

在下面的 AJAX 例子中,我们会演示当用户向一个标准的 HTML 表单中输入数据时网页如何与 web 服务器进行通信。

在文本框中输入名字......

例子解释 - HTML表单

表单的 HTML 代码:

<form> 
First Name:
<input type="text" id="txt1" onkeyup="showHint(this.value)" />
</form>

<p>Suggestions: <span id="txtHint"></span></p> 

 

正如您看到的,这是一个简单的带有名为 "txt1" 输入域的 HTML 表单。输入域的事件属性定义了一个由 onkeyup 事件触发的函数。

表单下面的段落包含了一个名为 "txtHint" 的 span,这个 span 充当了由 web 服务器所取回的数据的位置占位符。

当用户输入数据时,名为 "showHint()" 的函数就会被执行。函数的执行是由 "onkeyup" 事件触发的。另外需要说明的是,当用户在文本域中输入数据时把手指从键盘按键上移开时,函数 showHint 就会被调用。

例子解释 - showHint() 函数

showHint() 函数是一个位于 HTML 页面 head 部分的很简单的 JavaScript 函数。

此函数包含以下代码:

function showHint(str)
{

  
if (str.length==0)
    { 
    document.getElementById(
"txtHint").innerHTML="";
    
return;
    }

  xmlHttp
=GetXmlHttpObject()
  
  
if (xmlHttp==null)
    {
    alert (
"您的浏览器不支持AJAX!");
    
return;
    }

var url="gethint.asp";
url
=url+"?q="+str;
url
=url+"&sid="+Math.random();
xmlHttp.onreadystatechange
=stateChanged;
xmlHttp.open(
"GET",url,true);
xmlHttp.send(
null);
}

 

每当有字符输入文本框时,此函数就会执行。

假如文本域中存在某些输入,函数就会执行:

  • 定义回传数据的服务器的 url(文件名)
  • 使用文本框的内容向 url 添加参数(q)
  • 添加一个随机的数字,以防止服务器使用某个已缓存的文件
  • 创建一个 XMLHTTP 对象,并告知此对象当某个改变被触发时执行名为 stateChanged 的函数
  • 向服务器发送一个 HTTP 请求
  • 如果输入域为空,此函数仅仅会清空 txtHint 占位符的内容

例子解释 - GetXmlHttpObject() 函数

上面的例子可调用名为 GetXmlHttpObject() 的函数。

此函数的作用是解决为不同浏览器创建不同的 XMLHTTP 对象的问题。

这是此函数的代码:

function GetXmlHttpObject()
{
  
var xmlHttp=null;
  
try
    {
    
// Firefox, Opera 8.0+, Safari
    xmlHttp=new XMLHttpRequest();
    }
  
catch (e)
    {
    
// Internet Explorer
    try
      {
      xmlHttp
=new ActiveXObject("Msxml2.XMLHTTP");
      }
    
catch (e)
      {
      xmlHttp
=new ActiveXObject("Microsoft.XMLHTTP");
      }
    }
  
return xmlHttp;
}

 

例子解释 - stateChanged() 函数

stateChanged() 函数包含下面的代码:

function stateChanged() 

  
if (xmlHttp.readyState==4)
  { 
  document.getElementById(
"txtHint").innerHTML=xmlHttp.responseText;
  }
}

 

每当 XMLHTTP 对象的状态发生改变时,stateChanged() 函数就会执行。

当状态变更为 4(“完成”)时,txtHint 占位符的内容就被响应文本来填充。

AJAX 请求 源代码

AJAX Suggest 源代码的实例

下面的源代码属于上一节的 AJAX 实例。

您可以拷贝粘贴这些代码,然后亲自测试一下。

AJAX HTML 页面

这是 HTML 页面。它包含了一个简单的 HTML 表单,以及一个指向 JavaScript 的链接。

<html>
<head>
<script src="clienthint.js"></script> 
</head>

<body>

<form> 
First Name:
<input type="text" id="txt1" onkeyup="showHint(this.value)" />
</form>

<p>Suggestions: <span id="txtHint"></span></p> 

</body>
</html>

 

下面列出了 JavaScript 代码。

 

AJAX JavaScript

这是 JavaScript 代码,存储在文件 "clienthint.js" 中:

var xmlHttp

function showHint(str)
{

  
if (str.length==0)
    { 
    document.getElementById(
"txtHint").innerHTML="";
    
return;
    }

  xmlHttp
=GetXmlHttpObject()

  
if (xmlHttp==null)
    {
    alert (
"您的浏览器不支持AJAX!");
    
return;
    }

  
var url="gethint.asp";
  url
=url+"?q="+str;
  url
=url+"&sid="+Math.random();
  xmlHttp.onreadystatechange
=stateChanged;
  xmlHttp.open(
"GET",url,true);
  xmlHttp.send(
null);


function stateChanged() 

if (xmlHttp.readyState==4)

document.getElementById(
"txtHint").innerHTML=xmlHttp.responseText;
}
}

function GetXmlHttpObject()
{
  
var xmlHttp=null;
  
try
    {
    
// Firefox, Opera 8.0+, Safari
    xmlHttp=new XMLHttpRequest();
    }
  
catch (e)
    {
    
// Internet Explorer
    try
      {
      xmlHttp
=new ActiveXObject("Msxml2.XMLHTTP");
      }
    
catch (e)
      {
      xmlHttp
=new ActiveXObject("Microsoft.XMLHTTP");
      }
    }
return xmlHttp;
}

 

AJAX 服务器页面 - ASP 和 PHP

其实不存在什么“AJAX 服务器”。AJAX 页面可以由任一因特网服务器提供服务。

在上一节的例子中被 JavaScript 调用的服务器页面是一个简单的名为 "gethint.asp" 的 ASP 文件。

下面我们列出了这个服务器页面代码的实例,使用 ASP 来编写。

AJAX ASP 实例

"gethint.asp" 页面中的代码针对 IIS 使用 VBScript 编写。它会检查一个名字数组,然后向客户端返回相应的名字:

 

<%
response.expires
=-1
dim a(30)

'用名字为数组赋值
a(1)="Anna"
a(
2)="Brittany"
a(
3)="Cinderella"
a(
4)="Diana"
a(
5)="Eva"
a(
6)="Fiona"
a(
7)="Gunda"
a(
8)="Hege"
a(
9)="Inga"
a(
10)="Johanna"
a(
11)="Kitty"
a(
12)="Linda"
a(
13)="Nina"
a(
14)="Ophelia"
a(
15)="Petunia"
a(
16)="Amanda"
a(
17)="Raquel"
a(
18)="Cindy"
a(
19)="Doris"
a(
20)="Eve"
a(
21)="Evita"
a(
22)="Sunniva"
a(
23)="Tove"
a(
24)="Unni"
a(
25)="Violet"
a(
26)="Liza"
a(
27)="Elizabeth"
a(
28)="Ellen"
a(
29)="Wenche"
a(
30)="Vicky"

'从URL取得参数q
q=ucase(request.querystring("q"))

'如果q的长度大于0,则查找所有的hint
if len(q)>0 then
  hint
=""
  
for i=1 to 30
    
if q=ucase(mid(a(i),1,len(q))) then
      
if hint="" then
        hint
=a(i)
      
else
        hint
=hint & " , " & a(i)
      
end if
    
end if
  
next
end if

'如果找不到hint,则输出"no suggestion"
'
或者输出正确的值
if hint="" then 
  response.write(
"no suggestion")
else
  response.write(hint)
end if
%
>

AJAX 数据库实例

 

AJAX 可用来与数据库进行动态地通信。

 

AJAX 数据库实例

在下面的 AJAX 例子中,我们将演示如何使用 AJAX 技术令网页从数据库读取信息。

在框中选择一个名字......

AJAX 实例解释

上面的实例包含了一个简单的 HTML 表单以及执行 JavaScript 的链接:

<html>
<head>
<script src="selectcustomer.js"></script>
</head>

<body>

<form>
请选择一位客户:
<select name="customers" onchange="showCustomer(this.value)">
<option value="ALFKI">Alfreds Futterkiste
<option value="NORTS ">North/South
<option value="WOLZA">Wolski Zajazd 
</select>
</form>

<p>
<div id="txtHint"><b>客户信息将在此处列出。</b></div>
</p>

</body>
</html>

 

正如您看到的,这是一个简单的带有一个名为 "customers" 下拉列表的 HTML 表单。

表单以下的段落包含了一个名为 "txtHint" 的 div,这个 div 充当了由 web 服务器所取回的信息的位置占位符。

当用户选择数据时,名为 "showCustomer()" 的函数会被执行。函数的执行会被 "onchange" 事件触发。另外需要说明的是:每当用户改变下拉列表中的值,函数 showCustomer 就会被调用。

下面列出了 JavaScript 代码。

AJAX JavaScript

这是存储在文件 "selectcustomer.js" 中的 JavaScript 代码:

var xmlHttp

function showCustomer(str)

xmlHttp
=GetXmlHttpObject();
if (xmlHttp==null)
  {
  alert (
"您的浏览器不支持AJAX!");
  
return;
  } 
var url="getcustomer.asp";
url
=url+"?q="+str;
url
=url+"&sid="+Math.random();
xmlHttp.onreadystatechange
=stateChanged;
xmlHttp.open(
"GET",url,true);
xmlHttp.send(
null);
}

function stateChanged()

if (xmlHttp.readyState==4)

document.getElementById(
"txtHint").innerHTML=xmlHttp.responseText;
}
}

function GetXmlHttpObject()
{
var xmlHttp=null;
try
  {
  
// Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  
// Internet Explorer
  try
    {
    xmlHttp
=new ActiveXObject("Msxml2.XMLHTTP");
    }
  
catch (e)
    {
    xmlHttp
=new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
return xmlHttp;
}

 

AJAX 服务器页面

这个被 JavaScript 调用的服务器页面,是一个名为 "getcustomer.asp" 的简单的 ASP 文件。

此页面使用 VBScript 针对 IIS 编写。可以使用 PHP 或其他服务器语言对它进行改写。

此代码可运行针对某个数据库的 SQL,并以 HTML 表格返回结果:

<%
response.expires
=-1
sql
="SELECT * FROM CUSTOMERS WHERE CUSTOMERID="
sql
=sql & "'" & request.querystring("q"& "'"

set conn=Server.CreateObject("ADODB.Connection")
conn.Provider
="Microsoft.Jet.OLEDB.4.0"
conn.Open(Server.Mappath(
"/db/northwind.mdb"))
set rs = Server.CreateObject("ADODB.recordset")
rs.Open sql, conn

response.write(
"<table>")
do until rs.EOF
  
for each x in rs.Fields
    response.write(
"<tr><td><em>" & x.name & "</em></td>")
    response.write(
"<td>" & x.value & "</td></tr>")
  
next
  rs.MoveNext
loop

response.write(
"</table>")
%
>