AJAX基本介紹(web前端)


什么是AJAX?

首先AJAX = Asynchronous JavaScript and XML (異步的JavaScript和XML)。

AJAX不是一個新的編程語言,而是一種使用現有標准的新算法,也就是說他不是一門語言,是一種方法。其實這是幾門技術的一個綜合。主要是DOM,XML,JavaScript,JSON,CSS等。

AJAX的技術背景

ajax技術的流行得益於google的大力推廣,正是由於google earth、google suggest以及gmail等對ajax技術的廣泛應用,催生了ajax的流行。而這也讓微軟感到無比的尷尬,因為早在97年,微軟便已經發明了ajax中的關鍵技術,並且在99年IE5推出之時,它便開始支持XmlHttpRequest對象,並且微軟之前已經開始在它的一些產品中應用ajax,比如說MSDN網站菜單中的一些應用。遺憾的是,不知道出於什么想法,當時微軟發明了ajax的核心技術之后,並沒有看到它的潛力而加以發展和推廣,而是將它擱置起來。對於這一點來說,我個人是覺得非常奇怪的,因為以微軟的資源和它的戰略眼光來說,應該不會看不到ajax技術的前景,唯一的解釋也許就是因為當時它的主要競爭對手Netscape的消失反而使它變得麻痹和遲鈍,畢竟巨人也有打盹的時候,比如IBM曾經在對微軟戰略上的失誤。正是這一次的失誤,成就了它現在的競爭對手google在ajax方面的領先地位,而事實上google目前在ajax技術方面的領先是微軟所無法達到的,這一點在后面我講述ajax缺陷的時候也會提到。現在微軟也意識到了這個問題,因此它也開始在ajax領域奮起直追,比如說推出它自己的ajax框架atlas,並且在.NET2.0也提供了一個用來實現異步回調的接口,即ICallBack接口。那么微軟為什么對自己在ajax方面的落后如此緊張呢?現在就讓我們來分析一下ajax技術后面隱藏的深刻意義。

我對AJAX的理解:

我們從前端給服務器傳東西是直接傳到后台,前端頁面會等待服務器的回應,這樣很浪費時間。當后台傳過來數據之后整個頁面會刷新,在很多地方我們用的不方便,比如說我們做一個類似股市的模塊,不斷的更新數據,如果我們在這個頁面再添加一個評論功能的話,我們寫字寫了一半就會出現整個頁面刷新,導致我們的評論白寫了。所以說我們急需一門技術來解決這個問題,因此就出現了AJAX這么技術。有了AJAX之后,我們順利的解決了這個問題。AJAX就是類似一個中介,我們可以把它想成類似淘寶這個工具,前端將數據傳給AJAX這個工具,然后我們在我們的界面可以做我們的操作,而數據庫和AJAX對象之間進行數據傳輸,之后數據庫把數據傳給AJAX,AJAX再傳給前端,而且可以傳給指定的那個模塊,不會出現整個界面刷新。這樣就成功的解決了我們的問題。

關於同步異步:

異步傳輸是面向字符的傳輸,它的單位是字符;而同步傳輸是面向比特的傳輸,它的單位是楨,它傳輸的時候要求接受方和發送方的時鍾是保持一致的。

具體來說,異步傳輸是將比特分成小組來進行傳送。一般每個小組是一個8位字符,在每個小組的頭部和尾部都有一個開始位和一個停止位,它在傳送過程中接收方和發送方的時鍾不要求一致,也就是說,發送方可以在任何時刻發送這些小組,而接收方並不知道它什么時候到達。一個最明顯的例子就是計算機鍵盤和主機的通信,按下一個鍵的同時向主機發送一個8比特位的ASCII代 碼,鍵盤可以在任何時刻發送代碼,這取決於用戶的輸入速度,內部的硬件必須能夠在任何時刻接收一個鍵入的字符。這是一個典型的異步傳輸過程。異步傳輸存在 一個潛在的問題,即接收方並不知道數據會在什么時候到達。在它檢測到數據並做出響應之前,第一個比特已經過去了。這就像有人出乎意料地從后面走上來跟你說 話,而你沒來得及反應過來,漏掉了最前面的幾個詞。因此,每次異步傳輸的信息都以一個起始位開頭,它通知接收方數據已經到達了,這就給了接收方響應、接收 和緩存數據比特的時間;在傳輸結束時,一個停止位表示該次傳輸信息的終止。按照慣例,空閑(沒有傳送數據)的線路實際攜帶着一個代表二進制1的信號。步傳輸的開始位使信號變成0,其他的比特位使信號隨傳輸的數據信息而變化。最后,停止位使信號重新變回1,該信號一直保持到下一個開始位到達。例如在鍵盤上數字“1”,按照8比特位的擴展ASCII編碼,將發送“00110001”,同時需要在8比特位的前面加一個起始位,后面一個停止位。

同步傳輸的比特分組要大得多。它不是獨立地發送每個字符,每個字符都有自己的開始位和停止位,而是把它們組合起來一起發送。我們將這些組合稱為數據幀,或簡稱為幀。

  數據幀的第一部分包含一組同步字符,它是一個獨特的比特組合,類似於前面提到的起始位,用於通知接收方一個幀已經到達,但它同時還能確保接收方的采樣速度和比特的到達速度保持一致,使收發雙方進入同步。

  幀的最后一部分是一個幀結束標記。與同步字符一樣,它也是一個獨特的比特串,類似於前面提到的停止位,用於表示在下一幀開始之前沒有別的即將到達的數據了。

  同步傳輸通常要比異步傳輸快速得多。接收方不必對每個字符進行開始和停止的操作。一旦檢測到幀同步字符,它就在接下來的數據到達時接收它們。另外,同步傳輸的開銷也比較少。例如,一個典型的幀可能有500字節(即4000比特)的數據,其中可能只包含100比特的開銷。這時,增加的比特位使傳輸的比特總數增加2.5%,這與異步傳輸中25 %的增值要小得多。隨着數據幀中實際數據比特位的增加,開銷比特所占的百分比將相應地減少。但是,數據比特位越長,緩存數據所需要的緩沖區也越大,這就限制了一個幀的大小。另外,幀越大,它占據傳輸媒體的連續時間也越長。在極端的情況下,這將導致其他用戶等得太久。

     了解了同步和異步的概念之后,大家應該對ajax為什么可以提升用戶體驗應該比較清晰了,它是利用異步請求方式的。打個比方,如果現在你家里所在的小區因 某種情況而面臨停水,現在有關部門公布了兩種方案,一是完全停水8個小時,在這8個小時內完全停水,8個小時后恢復正常。二是不完全停水10 個小時,在這10個小時內水沒有完全斷,只是流量比原來小了很多,在10個小時后恢復正常流量,那么,如果是你你會選擇哪種方式呢?顯然是后者。

 AJAX原理和XmlHttpRequest對象

XMLHttpRequest對象的屬性有:

onreadystatechange 每次狀態改變所觸發事件的事件處理程序。

responseText 從服務器進程返回數據的字符形式。

responseXML 從服務器進程返回的DOM兼容的文檔數據對象。

status 從服務器返回的數字代碼,比如常見的404(未找到)和200(已就緒)

status Text 伴隨狀態碼的字符串信息

readyState 對象狀態值

  • 0(未初始化)對象已建立,但是尚未初始化(尚未調用open方法);
  • 1(初始化)對象已建立,尚未調用send方法;
  • 2(發送數據)send方法已經調用,但是當前的狀態及http頭未知;
  • 3(數據傳輸中)已接收部分數據,因為響應及http頭不全,這時通過responseBody和responseText獲取部分數據會出現錯誤;
  • 4(完成)數據接收完畢,此時可以通過responseXML和responseText獲取完整的回應數據。

但是由於各個瀏覽器之間有部分差異,所以我們定義對象也不同。比如IE瀏覽器用ActiveXObject對象。

接下來展示一下代碼:

這是一個get請求的異步請求。

 1 function sendXML(){
 2         var XMLHttp;
 3         if(window.ActiveXObject){
 4             //如果是IE
 5             XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
 6         }else{
 7             //如果是其他的瀏覽器
 8             XMLHttp = new XMLHttpRequest();
 9         };
10         //定義一個url
11         var url = "register.php?username="+document.getElementById('username').value+"&age="+document.getElementById('age').value;
12         //這里用get請求,url是傳輸的地址,true是異步傳輸,false同步傳輸
13         XMLHttp.open("get",url,true);
14         XMLHttp.onreadystatechange = function(){
15             if(XMLHttp.readyState == 4){
16                 if(XMLHttp.status == 200){
17                     var response = XMLHttp.responseText();
18                     alert("response");
19                 }
20             }
21         }
22         XMLHttp.send(null);
23     }

這段代碼是將username和age的值傳給register.php函數,請求方式是get請求,true是異步請求。這是js寫的。

接下來用jq來寫一段AJAX代碼:

 1 $.ajax({
 2         //類型是get方式
 3         type:"get",
 4         //發送請求的網址
 5         url:"register.php",
 6         //是否是異步請求
 7         async:"false",
 8         //請求的數據類型
 9         dataType:"jsonp",
10         //回調函數名
11         jsonpCallback:"fly",
12         //成功之后調用的函數
13         success:function(data){
14             alert("");
15         },
16         //失敗調用的函數
17         error:function(){
18             alert("");
19         }
20     });

這段代碼就是jq里邊的AJAX的寫法。

接下來是POST請求,首先是介紹JS中的代碼:

 1 var xmlHttp;        
 2 function S_xmlhttprequest(){ 
 3  if(window.ActiveXObject){  
 4   xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');
 5   }else if(window.XMLHttpRequest){  
 6    xmlHttp=new XMLHttpRequest();
 7    }
 8  }
 9  
10 function funphp100(n){
11 var data = "text=" +n;  //多個參數的,往后加
12  S_xmlhttprequest();
13 xmlHttp.open("POST","for.php",true);  
14 xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
15  xmlHttp.onreadystatechange=byphp;
16  xmlHttp.send(data);
17  }
18  
19 function byphp(){
20 var byphp100=xmlHttp.responseText;
21 document.getElementById("php100").innerHTML=byphp100;
22  }

下面是JQ里邊的post代碼:

 1   $.ajax({
 2             //提交數據的類型 POST GET
 3             type:"POST",
 4             //提交的網址
 5             url:"testLogin.aspx",
 6             //提交的數據
 7             data:{Name:"sanmao",Password:"sanmaoword"},
 8             //返回數據的格式
 9             datatype: "html",//"xml", "html", "script", "json", "jsonp", "text".
10             //在請求之前調用的函數
11             beforeSend:function(){$("#msg").html("logining");},
12             //成功返回之后調用的函數             
13             success:function(data){
14            $("#msg").html(decodeURI(data));            
15             }   ,
16             //調用執行后調用的函數
17             complete: function(XMLHttpRequest, textStatus){
18                alert(XMLHttpRequest.responseText);
19                alert(textStatus);
20                 //HideLoading();
21             },
22             //調用出錯執行的函數
23             error: function(){
24                 //請求出錯處理
25             }         
26          });

這就是基本的ajax方法。今后用的時候可以直接按照上邊寫的稍微改動一點就行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM