JavaScript Ajax實現異步通信
一、浏覽器與服務器的同步和異步通信
1.同步:是阻塞的,浏覽器在向服務器發送請求之後一直等待服務器的響應,而沒有做其他事情。
2.異步:非阻塞的,浏覽器向服務器發送請求之後,繼續執行其他代碼,知道服務器響應,浏覽器中斷當前的任務,處理服務器響應。
二、沒有Ajax之前浏覽器是通過iframe來實現異步刷新
1.iframe標簽:iframe標簽通過src連接到一個頁面,其實就是將需要實現異步刷新的內容使用
iframe標簽包裹,
A.對iframe實現整個頁面刷新,其實是通過刷新一個頁面的子頁面來實現異步刷新;
a.主頁面代碼:
<div>通過實現子頁面刷新來實現異步刷新</div> <iframe src="../testphp/data.php" frameborder="0"></iframe>
b.php頁面代碼:
<?php echo 1; ?>
B.通過在刷新子頁面的同時在子頁面做一些操作來訪問父頁面元素並且修改該元素的內容
a.主頁面代碼:
<div id="refreshTarget"></div> <form action="../php/data.php" method="post" target="targetIframe"> <input type="submit" value="提交"> </form> <iframe name="targetIframe" frameborder="0">iframe</iframe>
b.php頁面代碼:
<?php
echo 1;
?>
<script type="text/javascript">
parent.document.querySelector('#refreshTarget').innerHTML = '刷新成功';
</script>
三、Ajax實現異步刷新
1.使用get方法來發送請求:
/**
* 使用ajax get方式來驗證用戶名密碼是否正確
* 1.區別於表單,我們需要自己拼接查詢字符串,不是表單提交,可
* 以不為表單添加name屬性
* 2.將數據放在查詢字符串中傳到請求的頁面,然後頁面獲得數據進
* 行操作,然後對前端返回響應數據,解析數據,刷新
*/
var submit = document.querySelector('#submit');
submit.onclick = function(){
var nameValue = document.querySelector('#username').value;
var passValue = document.querySelector('#password').value;
var target = document.querySelector('#refreshTarget');
/* 實例化XMLHttpResquest*/
var xhr = new XMLHttpRequest();
/* 監控xhr對象的狀態,只要xhr.readyState值改變就會觸發事件由alert彈出框的值可以知道
a.以下xhr.readyState值為4的時候表示請求響應結束,數據接收完畢並且可以使用
b.xhr.status值為200表示請求成功
*/
xhr.onreadystatechange = function() {
alert(1);
if(xhr.readyState == 4) {
if(xhr.status == 200){
var data = xhr.responseText;
if(data == 1) {
target.innerHTML = '驗證成功';
}else if(data == 2) {
target.innerHTML = '驗證失敗';
}
}
}
}
/* 打開請求*/
var url = '../testphp/inspector.php?username='+nameValue + '&password='+
passValue;
xhr.open('get',url,true); // xhr.readyState = 1;
/* 發送請求*/
xhr.send(null); // xhr.readyState = 2;
alert(2);
}
2.使用post方法來發送請求:
/**
* 使用ajax post方式來驗證用戶名密碼是否正確
* 1.區別於表單,我們需要自己拼接查詢字符串,不是表單提交,可
* 以不為表單添加name屬性
* 2.將數據放在查詢字符串中傳到請求的頁面,然後頁面獲得數據進
* 行操作,然後對前端返回響應數據,解析數據,刷新
* 3.區別於ajax,get方法就是數據是放在send發送不是添加到查詢字符串
*/
var submit = document.querySelector('#submit');
submit.onclick = function(){
var nameValue = document.querySelector('#username').value;
var passValue = document.querySelector('#password').value;
var target = document.querySelector('#refreshTarget');
/* 實例化XMLHttpResquest*/
var xhr = new XMLHttpRequest();
/* 監控xhr對象的狀態,只要xhr.readyState值改變就會觸發事件由alert彈出框的值可以知道
a.以下xhr.readyState值為4的時候表示請求響應結束,數據接收完畢並且可以使用
b.xhr.status值為200表示請求成功
*/
xhr.onreadystatechange = function() {
alert(1);
if(xhr.readyState == 4) {
if(xhr.status == 200){
var data = xhr.responseText;
if(data == 1) {
target.innerHTML = '驗證成功';
}else if(data == 2) {
target.innerHTML = '驗證失敗';
}
}
}
}
/* 打開請求*/
var url = '../testphp/inspector.php?';
xhr.open('post',url,true); // xhr.readyState = 1;
/* 修改請求頭模擬from表單的post提交,
a.設置Content-type可以使得在php頁面中$_POST[‘key']的方式來獲取對應的值,不然的話必
須在$HTTP_RAW_POST_DATA對象中獲取
b.設置'Content-type'既是使用類似表單方式提交數據,所以一下必須對send發送的數據序列
化為‘name=name&value=value'的形式*/
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
var data = 'username='+nameValue+'&password='+passValue;
/* 發送請求*/
xhr.send(data); // xhr.readyState = 2;
}
請求的php頁面代碼
<?php
/* 設置響應數據的內容格式,和字符集*/
header('Content-type:text/html;charset=utf-8');
/*使用表單的post請求php頁面中可以通過$_POST來獲取*/
$username = $_POST['username'];
$password = $_POST['password'];
if($username == 'admin' && $password == '123'){
echo 1;
}else{
echo 2;
}
?>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。