AJAX基礎(chǔ)教程及初步使用_Xml教程

      編輯Tag賺U幣
      教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

      推薦:如何讓W(xué)ebServer返回指定XML內(nèi)容
        通過(guò)創(chuàng)建WEBServer代理可以當(dāng)作本地類(lèi)使用,但能不能返回指定的XML呢?比如通過(guò)checkpass服務(wù)檢測(cè)帳號(hào)和密碼之后要返回該用戶(hù)擁有的權(quán)限列表。怎么實(shí)現(xiàn)呢?   ASP.NET Web服務(wù)支持在公

      什么是 AJAX?

      AJAX (異步 JavaScript 和 XML) 是個(gè)新產(chǎn)生的術(shù)語(yǔ),專(zhuān)為描述JavaScript的兩項(xiàng)強(qiáng)大性能.這兩項(xiàng)性能在多年來(lái)一直被網(wǎng)絡(luò)開(kāi)發(fā)者所忽略,直到最近Gmail,Google suggest和google Maps的橫空出世才使人們開(kāi)始意識(shí)到其重要性。

      這兩項(xiàng)被忽視的性能是:

      無(wú)需重新裝載整個(gè)頁(yè)面便能向服務(wù)器發(fā)送請(qǐng)求。

      對(duì)XML文檔的解析和處理。

      步驟 1 – "請(qǐng)!" --- 如何發(fā)送一個(gè)HTTP請(qǐng)求

      為了用JavaScript向服務(wù)器發(fā)送一個(gè)HTTP請(qǐng)求,需要一個(gè)具備這種功能的類(lèi)實(shí)例. 這樣的類(lèi)首先由Internet Explorer以ActiveX對(duì)象引入,被稱(chēng)為XMLHTTP。后來(lái)Mozilla,Safari 和其他瀏覽器紛紛仿效,提供了XMLHttpRequest類(lèi),它支持微軟的ActiveX對(duì)象所提供的方法和屬性。

      因此,為了創(chuàng)建一個(gè)跨瀏覽器的這樣的類(lèi)實(shí)例(對(duì)象),可以應(yīng)用如下代碼:

      以下為引用的內(nèi)容:
      if (window.XMLHttpRequest) { // Mozilla,Safari,...
      http_request = new XMLHttpRequest();
      } else if (window.ActiveXObject) { // IE
      http_request = new ActiveXObject("Microsoft.XMLHTTP");
      }

      (上例對(duì)代碼做了一定簡(jiǎn)化,這是為了解釋如何創(chuàng)建XMLHTTP類(lèi)實(shí)例. 實(shí)際的代碼實(shí)例可參閱本篇步驟3.)

      如果服務(wù)器的響應(yīng)沒(méi)有XML mime-type header,某些Mozilla瀏覽器可能無(wú)法正常工作. 為了解決這個(gè)問(wèn)題,如果服務(wù)器響應(yīng)的header不是text/xml,可以調(diào)用其它方法修改該header.

      http_request = new XMLHttpRequest();

      http_request.overrideMimeType('text/xml');

      接下來(lái)要決定當(dāng)收到服務(wù)器的響應(yīng)后,需要做什么.這需要告訴HTTP請(qǐng)求對(duì)象用哪一個(gè)JavaScript函數(shù)處理這個(gè)響應(yīng).可以將對(duì)象的onreadystatechange屬性設(shè)置為要使用的JavaScript的函數(shù)名,如下所示:

      http_request.onreadystatechange = nameOfTheFunction;

      注意:在函數(shù)名后沒(méi)有括號(hào),也無(wú)需傳遞參數(shù).另外還有一種方法,可以在扉頁(yè)(fly)中定義函數(shù)及其對(duì)響應(yīng)要采取的行為,如下所示:

      以下為引用的內(nèi)容:
      http_request.onreadystatechange = function(){
      // do the thing
      };

      在定義了如何處理響應(yīng)后,就要發(fā)送請(qǐng)求了.可以調(diào)用HTTP請(qǐng)求類(lèi)的open()和send()方法,如下所示:

      http_request.open('GET','http://www.example.org/some.file',true);

      http_request.send(null);

      open()的第一個(gè)參數(shù)是HTTP請(qǐng)求方式 – GET,POST,HEAD 或任何服務(wù)器所支持的您想調(diào)用的方式. 按照HTTP規(guī)范,該參數(shù)要大寫(xiě);否則,某些瀏覽器(如Firefox)可能無(wú)法處理請(qǐng)求.有關(guān)HTTP請(qǐng)求方法的詳細(xì)信息可參考http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html W3C specs。

      第二個(gè)參數(shù)是請(qǐng)求頁(yè)面的URL.由于自身安全特性的限制,該頁(yè)面不能為第三方域名的頁(yè)面.同時(shí)一定要保證在所有的頁(yè)面中都使用準(zhǔn)確的域名,否則調(diào)用open()會(huì)得到"permission denied"的錯(cuò)誤提示.一個(gè)常見(jiàn)的錯(cuò)誤是訪(fǎng)問(wèn)站點(diǎn)時(shí)使用domain.tld,而當(dāng)請(qǐng)求頁(yè)面時(shí),卻使用www.domain.tld.

      第三個(gè)參數(shù)設(shè)置請(qǐng)求是否為異步模式.如果是TRUE,JavaScript函數(shù)將繼續(xù)執(zhí)行,而不等待服務(wù)器響應(yīng).這就是"AJAX"中的"A".

      如果第一個(gè)參數(shù)是"POST",send()方法的參數(shù)可以是任何想送給服務(wù)器的數(shù)據(jù). 這時(shí)數(shù)據(jù)要以字符串的形式送給服務(wù)器,如下所示:

      name=value&anothername=othervalue&so=on

      步驟 2 – "收到!" --- 處理服務(wù)器的響應(yīng)

      當(dāng)發(fā)送請(qǐng)求時(shí),要提供指定處理響應(yīng)的JavaScript函數(shù)名。

      http_request.onreadystatechange = nameOfTheFunction;

      我們來(lái)看看這個(gè)函數(shù)的功能是什么.首先函數(shù)會(huì)檢查請(qǐng)求的狀態(tài).如果狀態(tài)值是4,就意味著一個(gè)完整的服務(wù)器響應(yīng)已經(jīng)收到了,您將可以處理該響應(yīng)。

      以下為引用的內(nèi)容:
      if (http_request.readyState == 4) {
      // everything is good,the response is received
      } else {
      // still not ready
      }

      readyState的取值如下:

      0 (未初始化)

      1 (正在裝載)

      2 (裝載完畢)

      3 (交互中)

      4 (完成)

      接著,函數(shù)會(huì)檢查HTTP服務(wù)器響應(yīng)的狀態(tài)值. 完整的狀態(tài)取值可參見(jiàn) W3C site. 我們著重看值為200 OK的響應(yīng)。

      以下為引用的內(nèi)容:
      if (http_request.status == 200) {
      // perfect!
      } else {
      // there was a problem with the request,
      // for example the response may be a 404 (Not Found)
      // or 500 (Internal Server Error) response codes
      }

      在檢查完請(qǐng)求的狀態(tài)值和響應(yīng)的HTTP狀態(tài)值后,您就可以處理從服務(wù)器得到的數(shù)據(jù)了.有兩種方式可以得到這些數(shù)據(jù):

      http_request.responseText – 以文本字符串的方式返回服務(wù)器的響應(yīng)

      http_request.responseXML – 以XMLDocument對(duì)象方式返回響應(yīng).處理XMLDocument對(duì)象可以用JavaScript DOM函數(shù)

      步驟 3 – "萬(wàn)事俱備!" - 簡(jiǎn)單實(shí)例

      我們現(xiàn)在將整個(gè)過(guò)程完整地做一次,發(fā)送一個(gè)簡(jiǎn)單的HTTP請(qǐng)求. 我們用JavaScript請(qǐng)求一個(gè)HTML文件,test.html,文件的文本內(nèi)容為"I'm a test.".然后我們"alert()"test.html文件的內(nèi)容。

      以下為引用的內(nèi)容:

      <script type="text/javascript" language="javascript">
      var http_request = false;
      function makeRequest(url) {

      http_request = false;

      if (window.XMLHttpRequest) { // Mozilla,Safari,...
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType) {
      http_request.overrideMimeType('text/xml');
      }
      } else if (window.ActiveXObject) { // IE
      try {
      http_request = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
      try {
      http_request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {}
      }
      }

      if (!http_request) {
      alert('Giving up :( Cannot create an XMLHTTP instance');
      return false;
      }
      http_request.onreadystatechange = alertContents;
      http_request.open('GET',url,true);
      http_request.send(null);

      }

      function alertContents() {

      if (http_request.readyState == 4) {
      if (http_request.status == 200) {
      alert(http_request.responseText);
      } else {
      alert('There was a problem with the request.');
      }
      }

      }
      </script>
      <span
      style="cursor: pointer; text-decoration: underline"
      onclick="makeRequest('test.html')">
      Make a request
      </span>

      本例中:

      用戶(hù)點(diǎn)擊瀏覽器上的"請(qǐng)求"鏈接;

      接著函數(shù)makeRequest()將被調(diào)用.其參數(shù) – HTML文件test.html在同一目錄下;

      這樣就發(fā)起了一個(gè)請(qǐng)求.onreadystatechange的執(zhí)行結(jié)果會(huì)被傳送給alertContents();

      alertContents()將檢查服務(wù)器的響應(yīng)是否成功地收到,如果是,就會(huì)"alert()"test.html文件的內(nèi)容

      步驟 4 – "X-文檔" --- 處理XML響應(yīng)

      在前面的例子中,當(dāng)服務(wù)器對(duì)HTTP請(qǐng)求的響應(yīng)被收到后,我們會(huì)調(diào)用請(qǐng)求對(duì)象的reponseText屬性.該屬性包含了test.html文件的內(nèi)容.現(xiàn)在我們來(lái)試試responseXML屬性。

      首先,我們新建一個(gè)有效的XML文件,后面我們將使用這個(gè)文件.該文件(test.xml)源代碼如下所示:

      以下為引用的內(nèi)容:
      <?xml version="1.0" ?>
      <root>
      I'm a test.
      </root>

      在該腳本中,我們只需修改請(qǐng)求部分:

      ...
      onclick="makeRequest('test.xml')">
      ...

      接著,在alertContents()中,我們將alert()的代碼alert(http_request.responseText);換成:

      var xmldoc = http_request.responseXML;

      var root_node = xmldoc.getElementsByTagName('root').item(0);

      alert(root_node.firstChild.data);

      這里,我們使用了responseXML提供的XMLDocument對(duì)象并用DOM方法獲取存于XML文件中的內(nèi)容。

      Ajax初步使用方法

      Ajax定義為“Asynchronous JavaScript XML”的簡(jiǎn)稱(chēng),也就是異步的JavaScript和XML處理。從原理上看,主要是Ajax可以通過(guò)調(diào)用HttpRequest實(shí)現(xiàn)與服務(wù)器的異步通訊,并最終在網(wǎng)頁(yè)中實(shí)現(xiàn)豐富友好的用戶(hù)界面。

      Ajax使用初步,配置步驟:

      1、把Ajax.dll copy到應(yīng)用系統(tǒng)bin目錄下,然后在工程引用中引用Ajax.dll。

      2、配置web.config,添加如下信息

      以下為引用的內(nèi)容:

      <httpHandlers>
      <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory,Ajax" />
      </httpHandlers>3.假設(shè)應(yīng)用系統(tǒng)叫Document,目錄格式為Pages\AjaxTest
      4.在Pages\AjaxTest下建立cs文件AjaxMethod.cs,添加如下方法
      //[Ajax.AjaxMethod]
      [Ajax.AjaxMethod(Ajax.HttpSessionStateRequirement.Read)]
      public static string GetNIVNumber(string str)
      {
      return str;
      }5.在Pages\AjaxTest下建立頁(yè)面AjaxForm.aspx
      <HTML>
      <HEAD>
      <title>AjaxForm</title>
      <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
      <meta name="CODE_LANGUAGE" Content="C#">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
      <script language="javascript">
      function testAjax()
      {
      var first=document.getElementById("txtfirst");
      AjaxMethod.GetNIVNumber(first.value,callback_GetNIVNumber);
      }
      function callback_GetNIVNumber(res)
      {
      var obj=document.getElementById("txtsecond");
      obj.value=res.value;
      }
      </script>
      </HEAD>
      <body MS_POSITIONING="GridLayout">
      <form id="Form1" method="post" runat="server">
      <INPUT style="Z-INDEX: 101; LEFT: 208px; POSITION: absolute; TOP: 40px" type="button" value="Button"
      onclick="testAjax();">
      <asp:TextBox id="txtfirst" style="Z-INDEX: 102; LEFT: 40px; POSITION: absolute; TOP: 40px" runat="server"></asp:TextBox>
      <asp:TextBox id="txtsecond" style="Z-INDEX: 103; LEFT: 40px; POSITION: absolute; TOP: 72px" runat="server"></asp:TextBox>
      </form>
      </body>
      </HTML>protected System.Web.UI.WebControls.TextBox txtfirst;
      protected System.Web.UI.WebControls.TextBox txtsecond;
      private void Page_Load(object sender,System.EventArgs e)
      {
      //注冊(cè),其中Document.Pages.AjaxTest.AjaxMethod為AjaxMethod.cs方法所在的命名空間
      Ajax.Utility.RegisterTypeForAjax(typeof(Document.Pages.AjaxTest.AjaxMethod));
      }

      然后運(yùn)行就可以了,實(shí)現(xiàn)效果:在第一個(gè)textbox中輸入內(nèi)容,點(diǎn)擊button,就把內(nèi)容顯示到第二textbox中。這只是一個(gè)簡(jiǎn)單的示例,還可以修改調(diào)用方法,從數(shù)據(jù)庫(kù)讀取以及更復(fù)雜的操作。

      分享:XML編程實(shí)例:用ASP XML打造留言本
      一、讀者指引 讀者指引幫助你掌握本文的梗概。以免你看了大半才明白這編文章不適合你,給你造成視覺(jué)污染。 如果你正在用ASP XML寫(xiě)一些程序,或者你正在學(xué)XML那就值得一看。 閱讀本文須具

      來(lái)源:模板無(wú)憂(yōu)//所屬分類(lèi):Xml教程/更新時(shí)間:2008-08-22
      相關(guān)Xml教程