Ajax基礎詳解2

2022-05-03 20:39:07 字數 4314 閱讀 5167

沐晴又來更新啦,話說我們上回講到ajax中open方法的第三個引數非同步和同步的問題,今天呢,就來繼續往下嘮,先接著上回的**

var obtn = document.getelementbyid('btn');

obtn.onclick = function

()else

xhr.open('get','1.txt',true); //

設定請求資訊

xhr.send();//

提交請求

//等待伺服器返回內容

xhr.onreadystatechange = function

() }}

下面我們就講到 ,xhr.send();這一句呢才是真正請求資料的,open方法只是設定了一些請求引數。

現在呢請求遞交了,就等伺服器回應了,這個時候ajax的乙個屬性就要登場了,那就是responsetext,ajax請求返回的內容都放在了這裡面,而且不管你請求的內容是什麼,這裡存放的都是是字串型別。

當然我們上文也提到了,要想用非同步請求呢,這裡需要條件判斷才知道服務端對請求的內容是否響應完畢,這個時候另乙個屬性就要登場了,readystate,他代表著ajax請求過程的不同的狀態,引數如下:

0(初始化)還沒有呼叫open()方法

1(載入)已呼叫send()方法,正在傳送請求

2(載入完成)send()方法完成,已收到全部響應內容

3(解析)正在解析響應內容(因為收到的內容 並不是人能看懂的內容,所以需要解析)

4(完成)響應內容解析完成,可以在客戶端呼叫了

由上我們可以得到,在狀態2的時候已經回應了請求的內容了,但是這個內容我們人看不懂撒,機器才懂,所以就有3,幫我們解析這個內容,然後解析完成就變成4了,這個時候的內容,咱們前端就可以用了。

狀態是有了,可咱們怎麼能知道啥時候是啥狀態呢,這個時候我們就要用到乙個監控狀態的事件了onreadystatechange事件,當狀態值改變的時候觸發會觸發這個事件,所以當狀態為4的時候我們再彈出內容。

上面的**基本已經了解了原理,不過當然不是最完善的,這個時候,我們雖然監控到了狀態,響應了內容,但是內容不一定就是對的呀,比如可能內容出錯了,可能我們請求了乙個不存在的頁面,這個時候readystate是無法判斷錯誤的,我們需要知道內容是否正常,這個時候另乙個屬性status屬性就登場了,它代表的不是ajax狀態,而是伺服器(請求資源)的狀態, http狀態碼。狀態碼有很多,其中比較出名的就是200,成功狀態碼,和404 not found.其他的大家私下自行查閱。這裡可以看到。

所以我們的**要做進一步的改進

var obtn = document.getelementbyid('btn');

obtn.onclick = function

()else

xhr.open('get','1.txt',true); //

設定請求資訊

xhr.send();//

提交請求

//等待伺服器返回內容

xhr.onreadystatechange = function

() else }}

ajax的大概流程就是這樣的。當然還存在一些細節方面的問題需要注意的,繼續往下看把。get請求:

xhr.open('get','1.get.php?username=沐晴&age=21',true);
後台**不變

<?php 

header('content-type:text/html;charset="utf-8"'); //設定編碼格式,以及文件型別

error_reporting(0);

$username = $_get['username'];//獲取get請求方式的資料

$age = $_get['age'];

echo "你的名字:,年齡:"; //輸出內容

複製**

現在點選肯定會彈出你的名字沐晴,年齡21了。

這個時候呢,瀏覽器會有乙個快取,如果下次訪問相同的**,就會從快取裡取。

比如我現在想彈出,歡迎你,你的名字沐晴,年齡21,

xhr.open('get','1.get.php?username=沐晴&age=21&'+new.date.gettime(),true);
這樣就不會存在快取問題了。有些人會這樣寫,會在後面給它起個名字t,這個時候如果後台也有個變數叫t,可能就會出問題了,所以不是很推薦。

xhr.open('get','1.get.php?username=沐晴&age=21&t='+new.date.gettime(),true);
post 請求1  ajax中

post 資料放在send裡面作為引數傳遞。

所以post請求需要設定下面這兩句

2 xhr.send('username=沐晴&age=21');

3 無快取問題,因為單單是往伺服器提交資料,提交資料是不會被快取的,獲取資料才會被快取。這就是web的機制。

前面講的都是請求資料,現在來看一下後端接收請求,然後響應給我們的內容。

先看看後端對資料的處理:後端的資料型別也是很多的,我們不能直接把這樣的資料給前端吧,所以後端也需要做一定的處理,它有個方法json_encode可以根據資料型別不同,然後輸出不同格式。看下面的栗子

<?php 

header('content-type:text/html;charset="utf-8"');

error_reporting(0);

$arr1 = array('le','mo'); //

索引型別的資料

$arr2 = array('username'=>'le','age'=>32); //

2 對應關係的資料

echo json_encode($arr1);

//["le","mo"] 索引型別 輸出為陣列格式

echo json_encode($arr2); //

對應關係的資料 輸出為json格式

雖然後端輸出的內容格式上是陣列和json但是我之前提到過    alert( xhr.responsetext );//這裡彈出的可都是字串型別,所以儘管格式上看著是json和陣列,但實際的資料型別還是字串。

所以我們前端要對這些字串進行轉換。這個時候就用到了兩個方法

1 stringify() : 把json物件轉化成字串 轉換後的字串是嚴格的json格式

2 parse() : 把字串轉成物件,可以把後端返回的字串 轉成json格式,對於json,只能轉換嚴格json格式的字串,字串的鍵 比較用雙引號括起來 像這樣

下面來看個實際的案例:

需求:點選頁面按鈕,實現頁面不重新整理,在下面顯示新聞列表  看注釋應該能看懂

<?php 

header('content-type:text/html;charset="utf-8"');

error_reporting(0);

$news = array(

array('title'=>'女總理默克爾滑雪時摔倒 骨盆斷裂','date'=>'2014-1-6'),

array('title'=>'駐英外交官撰文互稱對方國家為"伏地魔"','date'=>'2014-1-6'),

array('title'=>'**:望與中國領導人會面 中方:你關閉了大門','date'=>'2014-1-6'),

array('title'=>'揭秘台灣駐港間諜網運作 湖北宜昌副市長被查','date'=>'2014-1-6'),

array('title'=>':嫦娥三號是貨真價實的中國創造','date'=>'2014-1-6'), );

echo json_encode($news);

好了今天的ajax就嘮到這,希望大家有所收穫,如果有錯誤的希望大家指正,看到好多人看頭像進來的,倫家真是不知道說什麼,還是希望大家能理性多提點意見拉拉,下次會講下對於ajax的封裝,以及一些實際應用。不見不散啦

Ajax基礎詳解教程 二

var obtn document.getelementbyid btn obtn.onclick function else xhr.open get 1.txt true 設定請求資訊 xhr.send 提交請求 等待伺服器返回內容 xhr.onreadystatechange function...

AJAX基礎 第2章( )

從第2章例2 2開始 html 基礎 iframe標記,又叫浮動幀標記,你可以用它將乙個html文件嵌入在乙個html中顯示。在指令碼語言與物件層次中,包含iframe的視窗我們稱之為父窗體,而浮動幀則稱為子窗體。iframe標記的使用格式是 src 檔案的路徑,既可是html檔案,也可以是文字 a...

AJAX學習 DOM基礎 2

閒話少說,繼續學習dom的一些基礎知識 childnodes 可以將節點樹中任何乙個元素的所有子元素檢索出來,這個屬性返回乙個陣列,包含 了給定元素節點的全體子元素。nodetype 一般用於文字節點 用來區分節點的型別,元素節點的nodetype屬性值是1,屬性節點的nodetype屬性值 是2,...