天天看點

AjaxAjaxGet方式Post方式XMLHttpRequest對象伺服器響應jQuery方式Ajax

Ajax

AJAX:“Asynchronous JavaScript and XML”,異步的JavaScript和XML。但好像沒XML啥事兒,主要就是一堆JavaScript代碼。

普通的網頁請求回執過程(請求響應模式),浏覽器送出請求之後要等着浏覽器傳回請求,期間不能做任何事。

AjaxAjaxGet方式Post方式XMLHttpRequest對象伺服器響應jQuery方式Ajax

Ajax模式,浏覽器将請求發送給Ajax引擎,讓其去和伺服器請求并且等待傳回的資料,浏覽器還可以接着向下執行别的操作。

AjaxAjaxGet方式Post方式XMLHttpRequest對象伺服器響應jQuery方式Ajax

打個比方,傳統方式是一個人在幹活,ajax是兩個人在幹活。

Ajax是一個浏覽器端的技術,Ajax引擎是由浏覽器實作的。Ajax技術的主要目的在于局部交換用戶端和伺服器之間的資料。能夠不用重新載入整個頁面來更新資料,也就是Refresh without Reload(輕重新整理)。

與伺服器之間的溝通,完全是通過JavaScript來實行。因為不用重新載入整個頁面,Ajax傳送的資料量很小,反應也會很快。注:JavaScript是一門單線程語言,無法指定開啟新的線程。

Get方式

建立一個Ajax.jsp,填寫代碼

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<script>
    window.onload=function(){
        //給按鈕注冊一個單擊事件
        document.getElementById('btnClick').onclick=function(){
            //1.建立一個XMLHttpRequest對象
            var xhr=null;
            //通過能力檢測,在不同浏覽器中建立該對象
            if(XMLHttpRequest){
                xhr=new XMLHttpRequest();
            }else if(ActiveXObject){
                xhr=new ActiveXObject("Microsoft.XMLHttp");
            }

            //2.設定回調函數
            xhr.onreadystatechange=function(){
                if(xhr.readyState==&&xhr.status==){
                    document.getElementById('dvTime').innerHTML='目前時間:'+xhr.responseText;
                }
            };

            //3.初始化請求,告訴xhr對象,使用get還是post請求,要請求哪個位址,是否是異步請求
            xhr.open('get','ShowTime.jsp',true);
            //如果想傳遞參數的話
            //xhr.open('get','ShowTime.jsp?name=eaglezsx&age=22',true);
            //通過Ajax發起請求,如果需要手動設定請求封包頭,則需要在初始化之後(open),在發送請求之前(send)
            xhr.setRequestHeader('if-modified-since','0');//設定浏覽器不使用緩存


            //4.開始發起請求
            xhr.send();//因為目前使用的是get請求,沒有請求封包體,是以傳遞null參數。
        };
    };
</script>
</head>
<body>
    <input type="button" id="btnClick" value="擷取伺服器時間"/>
    <div id="dvTime">
    目前時間:
    </div>
</body>
</html>
           

建立一個ShowTime.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    out.write(new java.util.Date().toLocaleString());
 %>
           

Post方式

xhr.open("POST", "ShowTime.jsp", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");//添加請求頭
xhr.send("name=eaglezsx&age=22");
           

XMLHttpRequest對象

XMLHttpRequest 是 AJAX 的核心對象。所有現代浏覽器均支援XMLHttpRequest對象(IE5和IE6使用ActiveXObject)。

建立對象

var xmlhttp;
if (window.XMLHttpRequest)
{
    //  IE7+, Firefox, Chrome, Opera, Safari 浏覽器執行代碼
    xmlhttp=new XMLHttpRequest();
}
else
{
    // IE6, IE5 浏覽器執行代碼
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
           

XMLHttpRequest就是個變量,如果浏覽器中定義了,為Object,會轉換為true。如果沒有定義,會轉換為undefined,而undefined會轉換為false。

向伺服器發送請求

xmlhttp.open("GET","ajax_info.txt",true);
xmlhttp.send();
           

open(method , url , async):規定請求的類型、URL以及是否異步處理請求。method:請求的類型;GET或POST。url:檔案在伺服器上的位置。async:true(異步)或false(同步)。

send(string):将請求發送到伺服器。string:僅用于POST請求。

xmlhttp.open("POST","/try/ajax/demo_post2.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Henry&lname=Ford");
           

setRequestHeader(header,value):向請求添加HTTP頭。

伺服器響應

如需獲得來自伺服器的響應,請使用 XMLHttpRequest 對象的 responseText 或 responseXML 屬性。

responseText:獲得字元串形式的響應資料

responseXML:獲得XML形式的響應資料

onreadystatechange事件

當請求被發送到伺服器時,需要執行一些基于響應的任務。每當readyState改變時,就會觸發onreadystatechange事件。readyState屬性存有XMLHttpRequest的狀态資訊。

onreadystatechange:存儲函數,每當readyState屬性改變時,就會調用該函數。

readyState:存有XMLHttpRequest的狀态。從0到4發生變化。

  • 0:請求未初始化
  • 1:伺服器連接配接已建立
  • 2:請求已接收
  • 3:請求進行中
  • 4:請求已完成,且響應已就緒

status:200:“OK”,404:“未找到頁面”

在onreadystatechange事件在中,規定當伺服器響應已做好被處理的準備時所執行的任務。

當readyState等于4且狀态為200時,表示響應已就緒:

xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState== && xmlhttp.status==)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
           

注意: onreadystatechange 事件被觸發 5 次(0 - 4),對應着 readyState 的每個變化。

注意事項

  • XMLHttpRequest隻能向同一個域中的相同端口号、相同協定的url發起請求,不能跨域,否則會引起錯誤。
  • 為了浏覽器相容,get請求時最好為send()傳遞null參數。
  • 在建立了xhr對象後立刻設定onreadystatechange事件,這樣就能監視到所有的狀态。如果不需要監視其他狀态隻監視readyState==4的狀态則可以在send()之前設定。
  • get請求會有緩存問題,解決方式有
    • xmlhttp.open("GET","/try/ajax/demo_get.php?t=" + Math.random(),true)//每次的都不一樣;

    • xhr.setRequestHeader('if-modified-since','0');

  • POST請求 時,為了像表單那樣送出資料需要設定請求的Content-Type為:application/x-www-form-urlencoded。send(“鍵=值&鍵=值”)
  • 通過ajax隻能傳遞一些基本的資料,傳遞不了檔案,要通過别的插件實作

jQuery方式Ajax

$(function(){
        $("#btnClick").click(function(){
            $.get("ShowTime.jsp",{"name":"eaglezsx","age":},
            function(data){
                $("#dvTime").html("目前時間"+data);
            });
        });
    });
           

若是post請求直接把get改成post就行了

還有一種形式

$("#txtLoginId").blur(function () {
                 $.ajax({
                     type:"post",
                     url:"song.php",
                     data:"name=joh&lat=ddd",
                     success:function (msg) {
                         alert(msg);
                     }
                 });
                 });
           

繼續閱讀