仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 538|回复: 7
打印 上一主题 下一主题

[学习教程] ASP网页编程之把握AJAX之AJAX通信手艺简介

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:19:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
专业性的服务。有的ASP商提供垂直型的应用服务,针对某一特定行业提供应用服务。ajax  当在网上冲浪时,将在扫瞄器和服务器之间存在大批的哀求。最后,一切的这类哀求都是在用户做出必要这一步骤的分明操纵时产生的。Ajax手艺将开辟职员从守候用户做出如许的操纵中束缚出来,同意他在任什么时候间创立一个对服务器的挪用。

  Ajax通讯撑持很多分歧的手艺。每种手艺都有本人的长处和弱点,因而懂得甚么情形利用哪种手艺是很主要的。

  埋没帧手艺

  跟着HTML帧的引进,埋没帧(hiddenframe)手艺也应运而生了。该手艺前面的基础设法是创立一个帧集,个中包括用于客户端―服务器通讯的埋没帧。能够经由过程将帧的宽度或高度设置为0像从来埋没一个帧,以使其不显现。只管一些初期的扫瞄器(诸如Netscape4)不克不及够完整埋没帧,常常会留下一些分明的帧边框,但该手艺仍是普遍地为开辟职员所接纳。

  1.形式

  埋没帧手艺遵守一种特定的四步形式(拜见-1)。第一步老是从一个与用户交互的Web页面中的可见帧入手下手的。明显,用户其实不晓得埋没帧的存在(在古代扫瞄器中,它是不显现的),以一般的情势与网页举行交互。在某些工夫,用户实行了一个必要从服务器猎取分外数据的操纵。当这个操纵产生时,第一步就产生了:发生一个对埋没帧的JavaScript函数挪用。这个挪用能够复杂地将埋没帧重定向到另外一个页面,大概庞大地传送表双数据。不论这个函数有多庞大,其了局都是发生第2步:向服务器发送一个哀求。


-1

  该形式中的第3步是从服务器上吸收一个呼应。因为处置的是帧,因而该呼应一定是另外一个网页。该网页必需包括从服务器前往的所哀求的数据,同时一些JavaScript将把这些数据传给可见的帧。一般,这是经由过程在前往的网页平分配一个onload事务处置函数(eventhandler)做到的,该网页在其全体载进以后挪用可见帧中的函数(这就是第4步)。当数据位于可见帧中后,该帧就能够决意怎样处置这些数据了。

  2.埋没帧的GET哀求

  我们已论述了埋没帧手艺的基础道理,如今将更深切地研讨它。关于任何一种新手艺,最好的办法就是经由过程详细的实例来进修。在该实例中,将创立一个复杂的查询页面,客户服务代表经由过程该页面能够查询客户的信息。因为这是本书的第一个例子,因而它非常的复杂:用户输出客户ID,然后吸收与该客户相干的信息。因为该功效一般必要数据库撑持,因而还必需做一些服务器真个开辟。该例子利用的是PHP――这是一种优异的开源服务端言语,还将利用到MySQL(在从www.mysql.org下载)――这是一种与PHP分离得很好的开源数据库。
  只管本例断定为利用MySQL,但只需大批的修正就能够在其他数据库上运转。

  起首,在完成客户材料查询之前,你必需有一个包括该信息的数据库表。可使用以下SQL剧本来创立一个客户表:
<P>CREATETABLE`Customers`(
 `CustomerId`int(11)NOTNULLauto_increment,
 `Name`varchar(255)NOTNULLdefault,
 `Address`varchar(255)NOTNULLdefault,
 `City`varchar(255)NOTNULLdefault,
 `State`varchar(255)NOTNULLdefault,
 `Zip`varchar(255)NOTNULLdefault,
 `Phone`varchar(255)NOTNULLdefault,
 `E-mail`varchar(255)NOTNULLdefault,
 PRIMARYKEY(`CustomerId`)
)TYPE=MyISAMCOMMENT=SampleCustomerData;

  在这张数据库表中最主要的字段是CustomerId,我们将经由过程它来查询客户信息。

  你能够在www.wrox.com下载这个剧本和一些测试数据。

  当建好数据库表后,就能够将精神转到HTML代码上了。要利用埋没帧手艺,起首必需创立一个HTML帧集,比方:


<P><framesetrows="100%,0"frameborder="0">
 <framename="displayFrame"src="display.htm"noresize="noresize"/>
 <framename="hiddenFrame"src="about:blank"noresize="noresize"/>
</frameset>

  这部分代码中最主要的是<frameset/>元素的rows属性。经由过程将其设置为100%,0,扫瞄器就晓得不显现名为hiddenFrame的第二个帧了。紧接着,将frameborder属性设置为0则是确保每一个帧都没有可见的边框。在帧集声明中最初一个主要的步骤是为每一个帧设置noresize属性,使得用户不成能在不经意间调剂帧的巨细而发明埋没帧,埋没帧的内容永久不会成为可显现的用户界面的一部分。

  接上去要处置的是一个哀求和显现客户信息的页面。这是一个绝对复杂的页面,由一个用来输出客户ID的文本框,一个实行哀求的按钮,和用来显现查询到的客户信息的<div>元素所构成:


<P><p>EntercustomerIDnumbertoretrieveinformation:</p>
<p>CustomerID:<inputtype="text"id="txtCustomerId"value=""/></p>
<p><inputtype="button"value="GetCustomerInfo"
/></p>
<divid="divCustomerInfo"></div>

  注重,按钮挪用的是名为requestCustomerInfo()的函数,该函数将卖力与埋没帧交互以猎取数据。它将猎取文本框中的值,将其增加到getcustomerdata.php的查询字符串上,以getcustomerdata.php?id=23的格局创立一个URL。然后将这个URL指派给埋没帧,以下就是这个函数的代码:


<P>functionrequestCustomerInfo(){
 varsId=document.getElementById("txtCustomerId").value;
 top.frames["hiddenFrame"].location="getcustomerdata.php?id="+sId;
}

  该函数的第一步是从文本框中猎取客户标识号("txtCustomerId")。这是将文本框的IDtxtCustomerId作为参数,挪用document.getElementById()函数,并猎取前往的value属性(value属性保留了文本框中的文本内容)来完成的。然后,将这个ID增加到字符串getcustomerdata.php?id=以后天生完全的URL。第二行代码则是创立此URL并将其赋给埋没帧。为了取得对埋没帧的援用,起首要利用top工具来猎取扫瞄器的顶级窗口(topmostwindow)。该工具具有一个frames数组,在个中能够找到这个埋没帧。因为每一个帧都是一个窗口工具,因而能够将其地位设置为预期的URL。

  这是收回哀求所需的一切信息。注重,因为这是一个GET哀求(经由过程一个查询字符串传送信息),因而是很复杂的。(很快,你将看到怎样利用埋没帧手艺来实行一个POST哀求。)

  除requestCustomerInfo()函数以外,还必要另外一个在查询后显现客户信息的函数。当数据前往时,埋没帧将挪用这个displayCustomerInfo()函数,其独一的参数是包括要显现的客户数据的字符串:


<P>functiondisplayCustomerInfo(sText){
 vardivCustomerInfo=document.getElementById("divCustomerInfo");
 divCustomerInfo.innerHTML=sText;
}

  在这个函数中,第一行代码将查询对用于数据显现的<div/>元素的援用。第二行代码将把包括客户信息的字符串(sText)的值赋给<div/>元素的innerHTML属性。利用innerHTML属性,能够将HTML嵌进到格局化的字符串中。这将由主显现页面的代码来完成。如今我们将创立服务器端程序逻辑。

  getcustomerdata.php中的基础代码是在基础的HTML页面上增加两处PHP代码:


<P><html>
<head>
<title>GetCustomerData</title>
<?php
//php代码
?>
</head>
<body>
<divid="divInfoToReturn"><?phpecho$sInfo?></div>
</body>
</html>

  在该页面中,第一个PHP代码块将包含查询客户数据的逻辑(很快将会商到)。而第二个PHP代码块则卖力将包括客户数据的$sInfo变量的值输入到<div/>元素中。从这个<div/>元素中,你能够读取该数据并将数据传送给显现帧。为此,必要创立在页面完整载进后挪用的JavaScript函数。


<P>window.onload=function(){
 vardivInfoToReturn=document.getElementById("divInfoToReturn");
top.frames["displayFrame"].displayCustomerInfo(divInfoToReturn.innerHTML);
};

  该函数将间接赋给window.onload事务处置函数中。它起首猎取对包括客户信息的<div/>元素的援用,然后利用数组top.frames会见显现帧,并挪用后面界说的displayCustomerInfo()函数,将其传给<div/>元素的innerHTML属性。这就是一切与发送该信息相干的JavaScript。但起首怎样猎取这些信息呢?必要一些PHP代码来从数据库查询信息。

  在PHP代码中的第一步是界说一切必要的数据块。在本例中,这些数据块包含用来查询的客户ID、前往信息的$sInfo变量,和会见数据库所必要的信息(数据库服务器、数据库名、用户名、暗码和SQL查询字符串):


<P><?php
 $sID=$_GET["id"];
 $sInfo="";
 $sDBServer="your.databaser.server";
 $sDBName="your_db_name";
 $sDBUsername="your_db_username";
 $sDBPassword="your_db_password";
 $sQuery="Select*fromCustomerswhereCustomerId=".$sID;

 //更多代码
?>

  这段代码起首从查询字符串中猎取id参数。为了便于猎取,PHP将一切的查询字符串参数构造于$-GET数组中。这个id存储在$sID中,它将用来创立存储于$sQuery中的SQL查询字符串。在此还将创立$sInfo变量,并将其设置为空字符串。在这段代码中的一切其他变量,都包括了指定特定命据库设置的信息,依据你本人的完成情况将其交换为准确的值。

  猎取了用户的输出,做好了毗连数据库的基础筹办,下一步就是创立数据库毗连,实行查询,前往了局。假如存在一个指定ID的客户,$sInfo将填进包括一切数据的HTML字符串,包含对电子邮件地点创立一个链接,假如客户ID是有效的,那末$sInfo将填进毛病动静,以传给显现帧:


<P><?php
 $sID=$_GET["id"];
 $sInfo="";
 $sDBServer="your.databaser.server";
 $sDBName="your_db_name";
 $sDBUsername="your_db_username";
 $sDBPassword="your_db_password";
 $sQuery="Select*fromCustomerswhereCustomerId=".$sID;
 $oLink=mysql_connect($sDBServer,$sDBUsername,$sDBPassword);
 @mysql_select_db($sDBName)or$sInfo="Unabletoopendatabase";

 if($oResult=mysql_query($sQuery)andmysql_num_rows($oResult)>0){
  $aValues=mysql_fetch_array($oResult,MYSQL_ASSOC);
  $sInfo=$aValues[Name]."<br/>".$aValues[Address]."<br/>".
$aValues[City]."<br/>".$aValues[State]."<br/>".
$aValues[Zip]."<br/><br/>Phone:".$aValues[Phone]."<br/>".
"<ahref="mailto:".$aValues[E-mail]."">".
$aValues[E-mail]."</a>";
 }else{
  $sInfo="CustomerwithID$sIDdoesntexist.";
 }
 mysql_close($oLink);
?>

  凸起显现的头两行代码用来完成从PHP到MySQL数据库的毗连。紧接着,挪用mysql_query()函数来实行SQL查询。假如函数前往了局,而且该了局最少包含一行,那末程序将猎取该信息,并将其存进变量$sInfo中;不然,$sInfo将填进一个毛病动静。最初两行则卖力开释数据库毗连。

  关于更庞大的PHP和MySQL编程的论述已超越了本文会商的局限。

  如今当$sInfo输入到<div/>元素时,它将包括准确的信息。onload事务处置函数将读取这些数据,然后将其发送到显现帧上。假如查询到客户,其响应的信息将会显现出来,如-2所示。

  另外一方面,假如客户不存在,则会在屏幕的不异地位显现毛病动静。不管怎样,客户服务代表都将取得一个很好的用户体验。你的第一个Ajax程序也就完成了。


-2

  3.埋没帧的POST哀求

  后面的例子利用GET哀求来从数据库中猎取信息。因为客户ID可以以查询字符串的情势增加到URL中,因而非常复杂。但假如必要发送POST哀求该怎样办呢?它也能够利用埋没帧手艺,不外必要一些分外的事情。

  POST哀求一般是用于向服务器发送数据的场所,而与GET哀求仅从服务器上猎取数据分歧。只管GET哀求能够经由过程查询字符串来向服务器发送分外的数据,但一些扫瞄器最多只可以处置512KB之内的查询字符串信息。关于POST哀求而言,则能够发送2GB的信息,可以优秀地满意尽年夜多半的使用。

  从传统意义上说,只可以经由过程将表单的method属性设置为post来发送POST哀求。然后,包括在表单中的数据就会经由过程POST哀求发送到action属性中指定的URL上。更庞大的成绩是当表单提交以后,将会从以后页跳转到一个新的URL上,这与Ajax的目标是南辕北辙的。但万幸的是,能够经由过程表单中一个不太出名的target属性来复杂完成。

  <form/>元素的target属性的功效从某种意义上说与<a/>元素的target属性的功效相似:用来指定跳转的目标URL。经由过程设置表单位素的target属性,能够无效地使得在其他帧或窗口(在本例中是埋没帧)中显现出表单的提交了局以后,表单页面仍旧坚持稳定。

  起首从头界说一个帧集。与上一个例子独一分歧的是可见帧包括了用来输出客户数据的表单:


<P><framesetrows="100%,0"frameborder="0">
 <framename="displayFrame"src="entry.htm"noresize="noresize"/>
 <framename="hiddenFrame"src="about:blank"noresize="noresize"/>
</frameset>

  输出表单的内容包括在一个<form/>元素中,并且针对保留在数据库中的每一个字段都有一个响应的文本框(除主动天生的客户ID以外)。一样也有一个<div/>元素,用来显现与客户端―服务器通讯相干的形态信息:


<P><formmethod="post"action="SaveCustomer.php"target="hiddenFrame">
<p>Entercustomerinformationtobesaved:</p>
<p>CustomerName:<inputtype="text"name="txtName"value=""/><br/>
Address:<inputtype="text"name="txtAddress"value=""/><br/>
City:<inputtype="text"name="txtCity"value=""/><br/>
State:<inputtype="text"name="txtState"value=""/><br/>
ZipCode:<inputtype="text"name="txtZipCode"value=""/><br/>
Phone:<inputtype="text"name="txtPhone"value=""/><br/>
E-mail:<inputtype="text"name="txtEmail"value=""/></p>
<p><inputtype="submit"value="SaveCustomerInfo"/></p>
</form>
<divid="divStatus"></div>

  注重,<form/>元素的target属性也设置为hiddenFrame,因而当用户点击该按钮时,提交的了局将显现在埋没帧中。

  在本例中,主页面中只必要一个JavaScript函数:savaResult()。当埋没帧前往客户数据保留了局时,将挪用该函数:


<P>functionsaveResult(sMessage){
 vardivStatus=document.getElementById("divStatus");
 divStatus.innerHTML="Requestcompleted:"+sMessage;
}

  埋没帧的职责是向该函数传送一个动静,该动静将显现给用户。它多是信息已保留切实其实认信息,大概是申明为何保留失利的毛病信息。

  接上去处置POST哀求的文件是SavaCustomer.php。与前一个例子一样,该页面也是由复杂的HTML页面加上一些PHP和JavaScript代码构成的。个中PHP代码用来从哀求中搜集信息,然后将其保留到数据库中。因为这是一个POST哀求,因而$_POST数组中包括了提交的一切信息:


<P><?php
 $sName=$_POST["txtName"];
 $sAddress=$_POST["txtAddress"];
 $sCity=$_POST["txtCity"];
 $sState=$_POST["txtState"];
 $sZipCode=$_POST["txtZipCode"];
 $sPhone=$_POST["txtPhone"];
 $sEmail=$_POST["txtEmail"];
 $sStatus="";

 $sDBServer="your.database.server";
 $sDBName="your_db_name";
 $sDBUsername="your_db_username";
 $sDBPassword="your_db_password";

 $sSQL="InsertintoCustomers(Name,Address,City,State,Zip,Phone,`E-mail`)".
"values($sName,$sAddress,$sCity,$sState,$sZipCode".
",$sPhone,$sEmail)";

 //更多代码
?>

  这个代码片断将猎取与客户相干的一切POST信息;别的,还界说了一个形态动静($sStatus)和所需的数据库信息(与上一个例子不异)。这里的SQL语句是一个INSERT语句,它将猎取的信息增加到数据库中。

  实行这个SQL语句的代码与上一个例子非常相似:


<P><?php
 $sName=$_POST["txtName"];
 $sAddress=$_POST["txtAddress"];
 $sCity=$_POST["txtCity"];
 $sState=$_POST["txtState"];
 $sZipCode=$_POST["txtZipCode"];
 $sPhone=$_POST["txtPhone"];
 $sEmail=$_POST["txtEmail"];

 $sStatus="";
 $sDBServer="your.database.server";

 $sDBName="your_db_name";
 $sDBUsername="your_db_username";
 $sDBPassword="your_db_password";

 $sSQL="InsertintoCustomers(Name,Address,City,State,Zip,Phone,`E-mail`)".
"values($sName,$sAddress,$sCity,$sState,$sZipCode".
",$sPhone,$sEmail)";

 $oLink=mysql_connect($sDBServer,$sDBUsername,$sDBPassword);
 @mysql_select_db($sDBName)or$sStatus="Unabletoopendatabase";

 if($oResult=mysql_query($sSQL)){
  $sStatus="Addedcustomer;customerIDis".mysql_insert_id();
 }else{
  $sStatus="Anerroroccurredwhileinserting;customernotsaved.";
 }

 mysql_close($oLink);
?>

  在此,mysql_query()函数的了局只是一个暗示语句实行乐成的唆使器。假如实行乐成,$sStatus变量中将填进一个动静,标明保留已乐成,并前往为该数据指定的客户ID。mysql_insert_id()函数一直前往在最新的INSERT语句前往值的基本上主动递增的值。假如由于某些缘故原由,该语句没有乐成实行,$sStatus变量将填进一个毛病动静。

  $sStatus变量将输入到一个在载进窗口时运转的JavaScript函数中:


<P><scripttype="text/javascript">
 window.onload=function(){
  top.frames["displayFrame"].saveResult("<?phpecho$sStatus?>");
 }
</script>

  这段代码挪用了savaResult()函数,该函数界说于显现帧中,传进的参数值是PHP变量$sStatus。因为该变量包括一个字符串,因而必需将PHP的echo语句放在引号中。当实行该函数时,假定客户数据已保留,则输出表单页面看起来如-3所示。


-3

  当实行这段代码以后,你还能够自在地利用一样的表单向数据库中增加更多客户,由于它不再消散。
<P>  4.埋没iFrame

  新一代的客户端―服务器通讯形式幕后所接纳的是iframe,它是在HTML4.0中引进的。iframe与帧基础是不异的,独一的区分是iframe能够放在一个未设置帧集的HTML页面中,可使页面中的恣意部分红为一个帧。iframe手艺能够在未事后设置帧集的页面中利用,可以更好地顺应于功效的渐渐增加。iframe乃至还可使用JavaScript在运转时创立,为了复杂起见,语义化HTML(semanticHTML)撑持使扫瞄器将Ajax功效看做是一个无益的加强(这将在稍后会商)。因为能够用与一般帧不异的办法利用和会见iframe,因而它们都是Ajax通讯的幻想选择。

  发扬iframe的上风有两种办法。最复杂的办法是在页面中复杂地嵌进iframe,并像埋没帧那样用来收回哀求。为此,第一个例子中的显现页面将修正为:

<p>EntercustomerIDnumbertoretrieveinformation:</p>
<p>CustomerID:<inputtype="text"id="txtCustomerId"value=""/></p>
<p><inputtype="button"value="GetCustomerInfo"
/></p>
<divid="divCustomerInfo"></div>
<iframesrc="about:blank"name="hiddenFrame"width="0"height="0"
frameborder="0"></iframe>
  注重,这个iframe中的width、height和frameborder属性都设置成了0,这可将其从视野中隐往。因为iframe的名字还是hiddenFrame,以是这个页面的JavaScript代码能够如前一样一般事情。不外,关于GetCustomerData.php页面还必要做一些小的修正。在该页面中的JavaScript函数先前是在名为displayFrame的帧中查找displayCustomerInfo()函数。假如你利用该手艺,又不存在该名字的帧,则必需修正代码,用parent来取代它:

window.onload=function(){
 vardivInfoToReturn=document.getElementById("divInfoToReturn");
 parent.displayCustomerInfo(divInfoToReturn.innerHTML);
};
  如今这个例子可以和本文中的第一例子一样一般事情了。

  第二种利用埋没iframe的办法是经由过程JavaScript静态地创立它们。因为并不是一切扫瞄器完成iframe的办法都是一样的,以是必要一些技能,使得它有助于一步步地创立埋没的iframe。

  第一步很复杂,利用document.createElement()办法创立iframe并付与需要的属性:

functioncreateIFrame(){
 varoIFrameElement=document.createElement("iframe");
 oIFrameElement.width=0;
 oIFrameElement.height=0;
 oIFrameElement.frameBorder=0;
 oIFrameElement.name="hiddenFrame";
 oIFrameElement.id="hiddenFrame";
 document.body.appendChild(oIFrameElement);

 //更多代码
}
  本段代码的最初一行很主要,由于它将iframe增加到document布局中;没有增加到document中的iframe是没法实行哀求的。别的注重,该iframe的name和id属性都是设置为hiddenFrame。这是需要的,由于有些扫瞄器是经由过程name属性会见新的帧,而有些则是经由过程id属性新的帧。

  紧接着界说一个全局变量,用来保留对该帧工具的援用。注重,针对iframe元素的这个帧工具并不是是从createElement()函数前往的。要取得该工具,必需从帧汇合中猎取。以下就是行将保留在全局变量中的内容:

varoIFrame=null;

functioncreateIFrame(){
 varoIFrameElement=document.createElement("iframe");
 oIFrameElement.width=0;
 oIFrameElement.height=0;
 oIFrameElement.frameBorder=0;
 oIFrameElement.name="hiddenFrame";
 oIFrameElement.id="hiddenFrame";
 document.body.appendChild(oIFrameElement);

 oIFrame=frames["hiddenFrame"];
}
  假如你将这些代码放到后面的iframe例子中,那末必要对requestCustomerInfo()函数举行以下修正:

functionrequestCustomerInfo(){
 if(!oIFrame){
  createIFrame();
  setTimeout(requestCustomerInfo,10);
  return;
 }

 varsId=document.getElementById("txtCustomerId").value;
 oIFrame.location="GetCustomerData.php?id="+sId;
}
  基于这些修正,该函数将会反省oIFrame是不是为空。假如为空,则挪用createFrame(),并会为该函数的挪用设置10ms的超不时间。这是很需要的,由于只要IE扫瞄器可以当即辨认拔出的iframe,年夜部分其他扫瞄器必要花几毫秒来辨认它,以同意经由过程它发送哀求。当再次实行该函数时,将实行代码的其他部分,个中最初一行已修正为对OIFrame工具的援用。

  只管该手艺可以很简单地使用于GET哀求,但POST哀求却完整分歧。只要一部分扫瞄器同意你设置表单的target属性来静态创立iframe;但IE并非个中的一种。因而,要利用埋没iframe手艺来发送POST哀求还必要一些技能。
<P>  5.埋没iframe的POST哀求

  要利用埋没iframe来完成POST哀求,其办法是在埋没帧中载进一个包括表单的页面,用数据添补该表单,然后再提交该表单。当这个可见的表单(你实践输出数据的谁人)提交时,必需作废此次提交而将信息转发给埋没帧。为此,必需界说一个函数,用来处置iframe的创立和埋没表单的载进:

functioncheckIFrame(){
 if(!oIFrame){
  createIFrame();
 }
 setTimeout(function(){
  oIFrame.location="ProxyForm.htm";
 },10);
}
  这个名为checkIFrame()的函数起首反省埋没的iframe是不是已创立。假如没有,则挪用createIFrame()。然后,在将iframe的地点设置为ProxyForm.htm(这是一个埋没表单页面)之前,为其设置一个超时价。因为该函数挪用必要花一些工夫,而主要的是该页面每次加载时都将提交该表单。

  ProxyForm.htm文件很复杂,只包含很少的JavaScript,用来提醒主页面已装载完成:

<html>
<head>
<title>ProxyForm</title>
<scripttype="text/javascript">
 window.onload=function(){
  parent.formReady();
 }
</script>
</head>
<body>
<formmethod="post"></form>
</body>
</html>
  正如你所见,该页面的主体只包括一个空的表单,而题目中只包括一个onload事务处置函数。当载进该页面时,页面将经由过程挪用parent.formReady()来使主页面晓得它已做好吸收哀求的筹办。而formReady()函数则是包括在主页面自己中的,相似于:

functionformReady(){
 varoHiddenForm=oIFrame.document.forms[0];
 varoForm=document.forms[0];

 for(vari=0;i<oForm.elements.length;i++){
  varoHidden=oIFrame.document.createElement("input");
  oHidden.type="hidden";
  oHidden.name=oForm.elements.name;
  oHidden.value=oForm.elements.value;
  oHiddenForm.appendChild(oHidden);
 }
 oHiddenForm.action=oForm.action;
 oHiddenForm.submit();
};

  在该函数中的第一步是猎取对埋没iframe中表单的援用,能够经由过程会见该帧的document.forms汇合来猎取。因为在该页面中只要一个表单,因而能够平安地从该汇合中取得第一个表单(即索引值为0),并将其存储于oHiddenForm中。然后,将对主页面表单的援用存于oForm中。紧接着,一个for轮回对主页面中该表单的各元素举行遍历(利用elements汇合)。关于表单中的每个元素,都将在埋没帧(注重,必需利用oIFrame.document.createElement()而不但是document.createElement())中创立一个埋没的输出元素。这个埋没的输出元素具有与该表单位素不异的名字和值,然后利用appendChild()函数将其增加到埋没的表单中。

  当一切的表单位素都增加完后,埋没的表单还将设置与主页面表单不异的action。经由过程从表单中读取action来代替硬编码,就能够在任何页面中利用formReady()。该函数的最初一步是提交这个埋没的表单。

  剩下的最初一件事就是确保主页面的表单不以一般的体例提交本人。要到达这一方针,只需在onsubmit事务处置函数中挪用checkIFrame()并前往false:

<formmethod="post"action="SaveCustomer.php"


<p>Entercustomerinformationtobesaved:</p>
<p>CustomerName:<inputtype="text"name="txtName"value=""/><br/>
Address:<inputtype="text"name="txtAddress"value=""/><br/>
City:<inputtype="text"name="txtCity"value=""/><br/>
State:<inputtype="text"name="txtState"value=""/><br/>
ZipCode:<inputtype="text"name="txtZipCode"value=""/><br/>
Phone:<inputtype="text"name="txtPhone"value=""/><br/>
E-mail:<inputtype="text"name="txtEmail"value=""/></p>
<p><inputtype="submit"value="SaveCustomerInfo"/></p>
</form>
<divid="divStatus"></div>
  经由过程以这类体例前往flase,能够制止表单的默许举动(将本人提交到服务器)。经由过程挪用checkIFrame()办法来启动埋没iframe中表单的提交历程。

  当这一义务完成后,就能够像利用埋没帧POST哀求的例子一样利用本例;页面SavaCustomer.php卖力处置数据,并当完成时挪用主页面中的savaResult()函数。

  注重,本节中的例子是为了使其聚焦于与Ajax手艺相干的成绩上,因此举行了简化。假如在实践的Web使用程序中利用,还必要供应更多的用户反应,诸如在收回哀求时屏障该表单的输出等。

  6.埋没帧手艺的长处和弱点

  如今,你已对利用埋没帧所完成的壮大功效有所懂得了,我们将会商它的有用性。正如后面所说的,该手艺已存在多年,而且仍旧在很多Ajax使用中利用。

  利用埋没帧的一个最年夜来由之一是它能够保护扫瞄器的汗青,利用户仍旧可以利用扫瞄器上的前进和行进按钮。扫瞄器因为其实不晓得埋没帧实践上被埋没了,但关于其所收回的哀求仍旧是纪录在案的。但是,Ajax使用程序的主页面却没有修正,在埋没帧中的修正意味着前进和行进按钮将根据该埋没帧的会见汗青而非主页面而变更。这也是为何Gmail和GoogleMaps仍旧利用该手艺的来由。

  注重,iframe并不是一向会存储扫瞄器的汗青纪录。只管IE一直会存储iframe的汗青纪录,但Firefox只对利用HTML界说(也就是不包含利用JavaScript静态创立)的iframe保留汗青纪录。Safari从不为iframe保留汗青纪录,不论它们是怎样包括在该页面中的。

  埋没帧手艺倒霉的一面是,对其面前产生的事懂得甚少。它完整依附于前往的准确页面。本节的例子都存在不异的成绩:假如埋没帧的页面载进失利,其实不会向用户提醒堕落动静;主页面将持续守候直到挪用得当的JavaScript函数。必需经由过程设置一个较长周期(多是5分钟)的超不时间,然后假如页面仍旧没有乐成载进则显现一条动静,以给用户一个慰藉。但这统统都只是一个变通办法,最次要的成绩是,关于背景产生的HTTP哀求缺少充分的信息。侥幸的,我们另有其他选择。SQLServer是基于服务器端的中型的数据库,可以适合大容量数据的应用,在功能上管理上也要比Access要强得多。在处理海量数据的效率,后台开发的灵活性,可扩展性等方面强大。
再现理想 该用户已被删除
沙发
发表于 2015-1-19 08:41:38 | 只看该作者
作为IE上广为流传的动态网页开发技术,ASP以它简单易学博得了广大WEB程序爱好这的青睐,而且它对运行环境和开发品台的不挑剔,以及有大量有效的参考手册,极大的推广了它的发展。
再见西城 该用户已被删除
板凳
发表于 2015-1-28 05:50:15 | 只看该作者
运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写,使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行。
只想知道 该用户已被删除
地板
发表于 2015-2-5 18:02:43 | 只看该作者
多看多学多思。多看一些关于ASP的书籍,一方面可以扩展知识面一方面可以鉴借别人是如何掌握、运用ASP的;多学善于关注别人,向同学老师多多学习,不论知识的大小;多思则是要将学到的知识灵活运用。
简单生活 该用户已被删除
5#
发表于 2015-2-13 05:16:52 | 只看该作者
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
兰色精灵 该用户已被删除
6#
发表于 2015-3-3 15:27:30 | 只看该作者
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题:
爱飞 该用户已被删除
7#
发表于 2015-3-18 15:48:44 | 只看该作者
不是很难但是英文要有一点基础网上的教程很少有系统的详细的去买书吧,另不用专门学习vb关于vbscript脚本在asp教材都有介绍
变相怪杰 该用户已被删除
8#
发表于 2015-3-26 07:45:15 | 只看该作者
下面简单介绍一下我学习ASP的方法,希望对想学习ASP的朋友有所帮助...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 10:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表