DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> AJAX入門 >> AJAX詳解 >> AJAX基礎教程及初步使用
AJAX基礎教程及初步使用
編輯:AJAX詳解     

AJax基礎教程

什麼是 AJax?
  AJax (異步 Javascript 和 XML) 是個新產生的術語,專為描述JavaScript的兩項強大性能.這兩項性能在多年來一直被網絡開發者所忽略,直到最近Gmail, Google suggest和google Maps的橫空出世才使人們開始意識到其重要性.

  這兩項被忽視的性能是:
  無需重新裝載整個頁面便能向服務器發送請求.
  對XML文檔的解析和處理.

步驟 1 – "請!" --- 如何發送一個HTTP請求

  為了用JavaScript向服務器發送一個HTTP請求, 需要一個具備這種功能的類實例. 這樣的類首先由Internet Explorer以ActiveX對象引入, 被稱為XMLHTTP. 後來Mozilla, Safari 和其他浏覽器紛紛仿效, 提供了XMLHttpRequest類,它支持微軟的ActiveX對象所提供的方法和屬性.

  因此, 為了創建一個跨浏覽器的這樣的類實例(對象), 可以應用如下代碼:

if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    http_request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
    http_request = new ActiveXObject("Microsoft.XMLHTTP");
}

  (上例對代碼做了一定簡化,這是為了解釋如何創建XMLHTTP類實例. 實際的代碼實例可參閱本篇步驟3.)

  如果服務器的響應沒有XML mime-type header,某些Mozilla浏覽器可能無法正常工作. 為了解決這個問題, 如果服務器響應的header不是text/XML,可以調用其它方法修改該header.

http_request = new XMLHttpRequest();
http_request.overrideMimeType('text/XML');

  接下來要決定當收到服務器的響應後,需要做什麼.這需要告訴HTTP請求對象用哪一個Javascript函數處理這個響應.可以將對象的onreadystatechange屬性設置為要使用的JavaScript的函數名,如下所示:

http_request.onreadystatechange = nameOfTheFunction;

  注意:在函數名後沒有括號,也無需傳遞參數.另外還有一種方法,可以在扉頁(fly)中定義函數及其對響應要采取的行為,如下所示:

http_request.onreadystatechange = function(){
    // do the thing
};

  在定義了如何處理響應後,就要發送請求了.可以調用HTTP請求類的open()和send()方法, 如下所示:

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

  open()的第一個參數是HTTP請求方式 – GET, POST, HEAD 或任何服務器所支持的您想調用的方式. 按照HTTP規范,該參數要大寫;否則,某些浏覽器(如Firefox)可能無法處理請求.有關HTTP請求方法的詳細信息可參考http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.Html W3C specs
  第二個參數是請求頁面的URL.由於自身安全特性的限制,該頁面不能為第三方域名的頁面.同時一定要保證在所有的頁面中都使用准確的域名,否則調用open()會得到"permission denIEd"的錯誤提示.一個常見的錯誤是訪問站點時使用domain.tld,而當請求頁面時,卻使用www.domain.tld.
  第三個參數設置請求是否為異步模式.如果是TRUE, JavaScript函數將繼續執行,而不等待服務器響應.這就是"AJax"中的"A".
  如果第一個參數是"POST",send()方法的參數可以是任何想送給服務器的數據. 這時數據要以字符串的形式送給服務器,如下所示:

name=value&anothername=othervalue&so=on


步驟 2 – "收到!" --- 處理服務器的響應

  當發送請求時,要提供指定處理響應的JavaScript函數名.

http_request.onreadystatechange = nameOfTheFunction;

  我們來看看這個函數的功能是什麼.首先函數會檢查請求的狀態.如果狀態值是4,就意味著一個完整的服務器響應已經收到了,您將可以處理該響應.

if (http_request.readyState == 4) {
    // everything is good, the response is received
} else {
    // still not ready
}

  readyState的取值如下:
  0 (未初始化)
  1 (正在裝載)
  2 (裝載完畢)
  3 (交互中)
  4 (完成)

  接著,函數會檢查HTTP服務器響應的狀態值. 完整的狀態取值可參見 W3C site. 我們著重看值為200 OK的響應.

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
}

  在檢查完請求的狀態值和響應的HTTP狀態值後, 您就可以處理從服務器得到的數據了.有兩種方式可以得到這些數據:

http_request.responseText – 以文本字符串的方式返回服務器的響應
http_request.responseXML – 以XMLDocument對象方式返回響應.處理XMLDocument對象可以用JavaScript DOM函數


步驟 3 – "萬事俱備!" - 簡單實例

  我們現在將整個過程完整地做一次,發送一個簡單的HTTP請求. 我們用JavaScript請求一個HTML文件, test.html, 文件的文本內容為"I'm a test.".然後我們"alert()"test.Html文件的內容.

<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"
    >
        Make a request
</span>


  本例中:
  用戶點擊浏覽器上的"請求"鏈接;
  接著函數makeRequest()將被調用.其參數 – HTML文件test.Html在同一目錄下;
  這樣就發起了一個請求.onreadystatechange的執行結果會被傳送給alertContents();
  alertContents()將檢查服務器的響應是否成功地收到,如果是,就會"alert()"test.Html文件的內容.

步驟 4 – "X-文檔" --- 處理XML響應

  在前面的例子中,當服務器對HTTP請求的響應被收到後,我們會調用請求對象的reponseText屬性.該屬性包含了test.Html文件的內容.現在我們來試試responseXML屬性.

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

<?XML version="1.0" ?>
<root>
    I'm a test.
</root>

  在該腳本中,我們只需修改請求部分:

...
>
...

  接著,在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對象並用DOM方法獲取存於XML文件中的內容.

AJax初步使用方法

AJax定義為“Asynchronous Javascript + XML”的簡稱,也就是異步的JavaScript和XML處理。從原理上看,主要是AJax可以通過調用HttpRequest實現與服務器的異步通訊,並最終在網頁中實現豐富友好的用戶界面
AJax使用初步,配置步驟
1.把Ajax.dll copy到應用系統bin目錄下,然後在工程引用中引用Ajax.dll,如果沒有的話可以下載/Files/singlepine/AJax.rar
2.配置web.config,添加如下信息


<httpHandlers>
  <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, AJax" />
</httpHandlers>3.假設應用系統叫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下建立頁面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"
    >
   <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)
{
 //注冊,其中Document.Pages.AjaxTest.AjaxMethod為AJaxMethod.cs方法所在的命名空間
 Ajax.Utility.RegisterTypeForAjax(typeof(Document.Pages.AjaxTest.AJaxMethod));
}然後運行就可以了,
實現效果:在第一個textbox中輸入內容,點擊button,就把內容顯示到第二textbox中。這只是一個簡單的示例,還可以修改調用方法,從數據庫讀取以及更復雜的操作

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved