Ajax基礎詳解1


         Ajax也是前端必備技能了,學習任何語言,都需要以理論為基礎的大量實踐才能真正學會,之前學了Ajax很多遍,因為缺乏大量實踐,總是會忘。所以不實踐是失敗之母。。。當然理論基礎也很重要啦,今天談談我對Ajax的基礎認知。

定義:全稱:Asynchronous JavaScript and XML(用異步的形式的JavaScript去操作XML)  用來傳輸進行數據交互 其實就是拿數據發數據。

作用:  傳統的數據提交,大多是通過表單的形式,填寫數據,點擊提交,數據就會被提交到后端,這種提交往往會跳轉頁面,存在很多問題,比如我們填完信息點了提交,就會跳到后端頁面,后端頁面進行驗證,發現用戶已經注冊了,這個時候又會跳轉到表單填寫頁面,讓我們回去重新填,那之前填的全沒了,肯定體驗很不好。而Ajax就是能做到私底下去請求頁面傳遞數據,然后返回給我們請求的結果,我們前端接收到這個結果,根據結果可以做一些操作,比如提示錯誤信息,整個頁面是一直處在表單填寫界面,從未跳轉。想想我們平常注冊帳號的時候,是不是沒跳轉界面就知道自己哪填的不對了,就是ajax在起作用。

下面我們先不解析具體的原理,先來看一個大致的實現過程。

首先,你得知道是把代碼放在服務器下運行的,打開的時候不能用本地的地址,要用localhost/。。這種形式才是在服務下訪問的。要是這不了解的話,可以先自行百度下。我平常都是用的xampp第三方集成的服務器,比較輕便。

需求:新建一個文字1.txt,隨便輸入什么內容,新建HTML頁面,點擊HTML頁面里的按鈕發生請求獲取1.txt里面的內容。這里只看js代碼。

var oBtn = document.getElementById('btn'); oBtn.onclick = function(){ var xhr = new XMLHttpRequest();  //創建Ajax對象 xhr.open('get','1.txt',true);    //設置請求信息 xhr.send(); //提交請求
//等待服務器返回內容 xhr.onreadystatechange = function() { if ( xhr.readyState == 4 ) { //判斷當前的請求狀態,4代表后端已經處理完成 alert( xhr.responseText ); //彈出內容 } } }

當點擊按鈕的時候,你就會發現彈出了1.txt里面的內容。

我們來具體解析一下這個步驟

 var xhr = new XMLHttpRequest(); //創建Ajax對象

我們要用Ajax獲取數據,首先呢,要創建一個Ajax對象,就跟你想獲取系統時間要創建一個時間對象是一個道理。對象的名稱就是 XMLHttpRequest(),創建好之后我們就可以用對象下的方法屬性進行數據交互了。

需要說明的是,這個對象實際是存在兼容問題的,IE6以下沒有這個對象的,所以是獲取不到數據的,IE6以下用的實際是一個插件的方式:

 ActiveXObject(‘Microsoft.XMLHTTP’) //ActiveXObject: IE6下插件的總稱,包含很多插件 //Microsoft.XMLHTTP:具體某個插件的名字

所以我們需要對上面做一個兼容性的處理:

var xhr = null; if(window.XMLHttpRequest){ //加window是因為如果直接判斷IE下不存在的東西會報錯,加了window,就是在判斷一個屬性是否存在,這樣就不會報錯了(當然我們都知道所有的東西都在window對象下,所以這樣判斷是有效的)
    xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject(‘Microsoft.XMLHTTP’); }

接着看

xhr.open('get','1.txt',true); //設置請求信息
Open方法:有三個參數 1、提交方式 Form-method(get/post) 2、提交地址 Form-action 3、是否異步,是為(true)

首先講提交方式:get/post 這兩種的區別。

這里我們不用ajax的方式,先直接通過傳統的表單提交數據來分析。

傳統的表單提交就是在表單里面設置提交的一些參數,用戶的輸入信息點擊提交,會跳到指定的后台頁面。

表單form標簽的屬性:
action:提交到哪里 默認是當前頁面
method:提交方式 默認是Get
enctype: 提交的數據格式,默認是application/x-www-form-urlencoded

我們來具體看個get方式請求的栗子,並且了解前后端到底是怎么交互的。

栗子需求:建立HTML頁面,PHP頁面,填入數據,點擊提交,然后輸出我們輸入的內容。

HTML頁面:

<form action="1.get.php">
    <input type="text" name="username">
    <input type="text" name="age">
    <input type="submit" value="按鈕" />
</form>

1.get.php(如果不了解PHP語言,大概看下面的注釋簡單知道干啥就行了)

<?php header('content-type:text/html;charset="utf-8"'); //設置編碼格式,以及文檔類型 error_reporting(0); $username = $_GET['username'];//獲取get請求的方式得到填寫的數據 這里$_GET里的參數是要和前端標簽中的name屬性是保持一致的
$age = $_GET['age']; echo "你的名字:{$username},年齡:{$age}"; //輸出內容

觀察實驗結果,當點擊按鈕,頁面會跳到1.get.php頁面,把內容輸出。並且觀察上面的地址欄,會發現我們輸入的信息被放在了地址欄上。

    這里就要講一下網絡請求方面的知識,當我們輸入網址獲取內容,整個過程是怎么發生的呢?瀏覽器又做了什么?

    首先要講一下HTTP協議,雖然表面上我們通過代碼來實現了交互,實際上在網絡請求的時候內部是通過各種協議達到了想要的結果,這個協議呢就是一種規范,因為網絡上存在太多不同類型的東西,要想互相能交流傳遞就需要一種共同遵守的約定,才能理解。而我們這里就用到了HTTP協議,希望有機會的人已經要去學習一下計算機網絡方面的東西,這里推薦一本書《圖解HTTP》,是我看過最清晰易懂的書了,其實有一個系列,都可以看看。

   所以當我們輸入網址的時候,瀏覽器根據HTTP協議生成一個請求報文發送給服務端,然后服務端收到這個報文就會進行處理然后回應給我們一個響應報文。這兩個報文里面含有請求和回應的各種信息。其實從代碼角度來看,請求報文是通過前端代碼可以設置的,比如何時發送發送給誰,響應報文就是后端代碼處理后返回的一個結果。

請求報文里一般包括請求的方法(GRT/POST),請求的URL或傳遞的數據等。

響應報文里有請求狀態碼,比如200表示請求成功,還有返回的一些數據等。

具體我們不說太多,可以自己私下多了解,,主要來說的是GET請求方式和POST的不同在請求報文上的體現。

其實整個GET請求過程如下,假設后台語言是PHP。

1 輸入用戶信息,點擊提交,跳到指定的后台的頁面.

2 GET方式會把用戶輸入的數據名稱和對應的值以這樣的格式(username=value&age=value )串連起來,放在指定的后台頁面的地址欄的問號(?)后面。並且把請求數據放到了請求報文里。

3 后台的代碼 ,可以通過PHP語言中的$_GET方法,獲取到請求報文的用戶信息,用$_GET['username']; $_GET['age']方法獲取到值;然后就可以進行一系列邏輯處理。

由此,我們可以知道GET方式:

1 把數據名稱和對應的值串連(username=value&age=value ),然后把數據放到指定頁面的url地址?后面,然后數據會被加入到請求報文中發送給后端。所以我們完全可以在后台頁面的地址欄上手動更改信息,相應的請求報文就會發生變化,GET方式請求的信息在請求報文里也看得到,所以get方式是不安全的,一般不用來提交比較敏感數據,大部分是獲取數據的時候用。

2 url有長度限制,所以GET請求的方式有數據量限制,每個瀏覽器都不同,所以不要用這種方式傳遞過長的數據。不然會被截取,導致傳遞數據不完整。

3 只能傳遞字符串類型 

 

因為是用戶名是中文的時候,會默認編碼了,所以username后面是亂碼。

下面來看看POST方式,同樣是這樣的需求

HTML頁面:

<form action="1.get.php" method="post">
    <input type="text" name="username">
    <input type="text" name="age">
    <input type="submit" value="按鈕" />
</form>

1.get.php

<?php header('content-type:text/html;charset="utf-8"'); error_reporting(0); $username = $_POST['username'];//不同的請求方式方法不同,$_POST方法專門用來獲取POST方式請求的數據
$age = $_POST['age'];
echo "你的名字:{$username},年齡:{$age}";

我們看到輸出信息頁面,地址欄上沒有用戶信息了,我們打開開發者工具,找到網絡就可以看到我們的請求報文,點進去就是具體內容,看上面的第二個圖,可以看到一些請求信息,有請求的編碼格式,還有請求地址等,POST請求的數據實際是在請求報文的實體里進行傳遞的,所以更安全些,但是我們發現我們通過控制台還是可以看到提交的信息,所以其實它也沒有很安全,一般還是要對輸入的信息進行加密。

我們看第三張圖,可以看到請求的數據,上面的其實是瀏覽器已經按照某種格式輸入的信息,下面的源代碼才是實際傳遞的信息,可以看到串連的格式和GET請求是一樣的,用戶名后面的亂碼是編碼了,當傳遞的是中文的時候,才會進行這樣的編碼。

由此我們可以知道

Post請求
1 數據的串連格式和Get請求是一樣的。
2 通過請求報文的信息,通過瀏覽器內部傳輸,不會表現在網址上。

3 傳輸數據量 Post理論上無限

4 可以傳遞多種數據類型(文本類型,二進制)。

關於Open方法的第一個參數提交方式就講到這里,第二個地址先簡單了解,下面來看第三個參數關於異步和同步。

同步:就是一種阻塞模式,比如代碼var a =1 ; alert(a);這就是一種同步,必須執行了第一種var a =1,你才會彈出a的值。

缺點:一般當你后面的代碼需要用到前面的東西的時候 適合用同步,如果兩句代碼完全無關,那用同步就沒有必要了。

異步:就是一種非阻塞模式,最明顯的例子,就是定時器,當我們寫了一個30s后執行的定時器的時候,在30S內定時器后面的代碼是可以執行的,而不是過了30s后面代碼才能執行,這就是一種異步。

缺點:當你后面的代碼需要用到前面的東西的時候 如果用異步,那么后面的代碼會在前面還沒加載好就出來,可能會有問題。
解決:當你后面的代碼需要用到前面的東西的時候,可以用條件判斷來決定這些代碼的執行,如果條件達成了就可以執行。

還拿上面的舉個栗子

var oBtn = document.getElementById('btn'); oBtn.onclick = function(){ var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject(‘Microsoft.XMLHTTP’); } xhr.open('get','1.txt',true); //設置請求信息 
 xhr.send();//提交請求
 //等待服務器返回內容 這里后面會具體講,大概就是監聽服務器的狀態,先簡單了解即可
  xhr.onreadystatechange = function() { if ( xhr.readyState == 4 ) { //如果內容響應成功,並解析完成 alert( xhr.responseText ); //彈出內容 
 } } } 

在上面的代碼中xhr.send()提交請求是需要時間的,所以必須要等到一定時間提交成功后,我們后面的才能正確獲取到內容,所以這就是后面的代碼正確執行,依賴於前面,

但是如果用同步的話,我們后面那些不依賴這些前面代碼的代碼也沒辦法執行,體驗就不好了,所以我們選擇用異步,而對於這些依賴前面代碼執行的代碼,我們就進行判斷

if ( xhr.readyState == 4 )就是判斷如果數據響應到了,收到了,再彈出內容。(如果我們不判斷,按照異步的原理,就會立馬彈出來,獲取數據需要時間,因為實際還沒獲取到數據,所以會彈出空,怕誤解,所以這里我再強調下).


由於Ajax內容比較多,所以會分開來講,我們下節博客繼續分析,我是沐晴,不見不散

 


免責聲明!

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



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