2九、Jquery Ajax

Ajaxjavascript

Asynchronsous Javascript and XML(異步Javascript和XML)。php

Ajax 是一種無需從新加載整個頁面的狀況下,更新局部頁面的技術。css

不是指一種單一的技術,是利用了一系列技術:Javascript + XMLHttpRequest + css + 服務器端的集合。html

http請求java

get請求ajax

主要用於獲取數據,由於在url中鏈接參數,而且容量很低,相對來說不安全。json

post請求bootstrap

主要用於上傳數據,由於會封裝在請求報文中,安全性通常,容量幾乎無限。跨域

Javascript Ajax瀏覽器

首先查看一下在Javascript中如何使用Ajax請求

<input type="button" value="讀取txt" id="btn" />
<script type="text/javascript">
    var btn = document.getElementById("btn");
    btn.onclick = function () {

        //一、建立Ajax對象
        var xhr = null;
        if (window.XMLHttpRequest) {
            xhr = new XMLHttpRequest(); //ie6以上、frefox 等
        } else {
            xhr = new ActiveXObject('Microsoft.XMLHTTP'); //ie6
        }

        //二、鏈接服務器
        xhr.open("get", "price.txt?time=" + Date.parse(new Date()), true); //get請求,url地址,是否異步
        //使用get請求時,要加一個時間戳來讓每次請求都不同,不然當目標頁面發生變化時,瀏覽器會緩存

        xhr.setRequestHeader("If-Modified-Since", "0"); //或者不使用時間戳 設置請求頭爲不緩存

        //三、發送請求
        xhr.send(null); //爲了兼容寫上null    

        /* post方式  
        xhr.open("post", "price.txt", true); //post  
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); //添加HTTP請求頭
        xhr.send("name=bai&last=wei"); //發送數據到服務器  
        */

        //四、接收返回值  
        //異步使用XMLHttpRequest對象時,必須使用onreadystatechange事件,並檢查readyState屬性,看是否完成請求
        xhr.onreadystatechange = function () { //當readyState 改變時就會觸發onreadystatechange 事件
            //readyState共有4個狀態:0(未初始化),1(正在載入),2(載入完成),3(開始解析),4(請求完成)。
            //status表明請求結果,返回http狀態碼,如:200 表明成功, 404 找不到頁面
            if (xhr.readyState == 4 && xhr.status == 200) {
                document.write(xhr.responseText); //服務器相應並不是XML時 使用responseText屬性。       document.write(xhr.responseXML); //服務器相應爲XML時 並且須要XML對象進行解析 使用responseXML屬性。            return false;
            }
        }
    }
</script>

XMLHttpRequest經常使用方法

abort() 取消請求

setRequestHeader() 設置請求頭

getAllResponseHeaders() 獲取http響應頭整個列表

getResponseHeader('key') 獲取指定http相應頭

注意事項

Ajax只能向同一個域名中的相同端口號、相同協議的url發起請求,不能夠跨域,不然會引起錯誤。

爲了瀏覽器兼容 get請求send最後傳遞null參數。  

get請求時 最好使用encodeURIComonent()進行編碼,不然某些瀏覽器下沒法獲取值。

解析Json格式時 eval("("+json+")"),但有安全性問題。

 

Jquery Ajax

使用原始Ajax, 咱們須要作較多的事情, 好比建立XmlHttpRequest對象,  判斷請求狀態, 編寫回調函數等.

Jquery提供了幾個用於發送Ajax請求的函數,包括load、get、getJSON、post、Ajax。其中Ajax是核心方法,其餘方法只是他的一個簡化調用。

1、load(url,[data],[callback])

load()方法能夠將遠程的一個頁面加載到當前DOM中。

默認使用get方式,若是傳遞了data參數則使用post方式。

可使用選擇器選擇將部份內容載入。

<div id="container"></div>
<input type="button" value="loadGet" id="loadGet" />
<input type="button" value="loadPost" id="loadPost" />
<input type="button" value="loadCallBack" id="loadCallBack" />
<input type="button" value="loadFiltHtml" id="loadFiltHtml" />

添加點擊事件

$(function(){
    //get方式請求 注意時間戳 不然瀏覽器緩存
    $("#loadGet").click(function(){
        $("#container").load("abc.aspx?time=" + Date.parse(new Date()));
    });
    
    //post方式請求
    $("#loadPost").click(function(){
        $("#container").load("abc.aspx",{
            id:12,
            name:'david'
        });
    });
    
    //發送post請求,並調用回調函數
    $("#loadCallBack").click(function(){
        $("#container").load("abc.aspx",{
            id:12,
            name:"david"
        },function(responseText,textStatus,XMLHttpRequest){
            //responseText 返回的字符串
            //textStatus 請求狀態
            //XMLHttpRequest 對象
            alert(responseText + "," + textStatus + "," + XMLHttpRequest);
        });
    });
    
    //發送get請求,只獲取id爲targetContent的內容
    $("#loadFiltHtml").click(function(){
        $("#container").load("abc.aspx?time=" + Date.parse(new Date()) + " #targetContent")
    });
});

注意 load不能夠跨域 如load("http://www.baidu.com/") 報錯。

2、$.get(url,[data],[callback],[type])

get()方法的參數能夠在路徑中拼接

$.get("abc.aspx?id=1&name=3&time=" + Date.parse(new Date()))

也能夠在參數中指定,兩種效果相同。

$.get("abc.aspx",{id:1,name:"3"});

type參數用於設置返回的數據類型,能夠是xml,html(默認),script,json,jsonp,text

$("#btn").click(function(){
    $.get("abc.aspx",{id:1,name:"3"},function(data,textStatus){
        alert(data + "," + textStatus); //data返回的數據,textStatus狀態碼
    },"html");
});

3、$.getJSON(url,[data],[callback])

經過HTTP GET請求 載入 JSON 數據,等同於$.get(url,[data],[callbak],"json")。

什麼是JSON呢?

JSON是一個標準,就像XML同樣,JSON規定了對象以什麼樣的格式保存爲一個字符串,將複雜對象序列化爲一個字符串,在瀏覽器端再將字符串反序列化爲javascript能夠讀取到對象。

數據使用鍵值對存儲 "key":"value",使用逗號分割 "key1":"value1","key2":"value2"。使用花括號保存對象 lala:{"name":"value","name":123}

在C#中使用JSON

C#將.NET對象序列化爲Javascript字符串的方法:JavaScriptSerializer().Serialize(p),JavaScriptSerializer在System.Web.Extensions.dll中,是3.0新增的類。

創建一個hanlder文件。

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/plain";
    List<value> lists = new List<value>();
    lists.Add(new value(1, "嘉文", 18));
    lists.Add(new value(2, "蓋倫", 28));
    lists.Add(new value(3, "趙信", 38));
    System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
    var jsonData = js.Serialize(lists);
    context.Response.Write(jsonData);
}
public class value
{
    public value(int id, string name, int age)
    {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public int id { get; set; }
    public string name { get; set; }
    public int age { get; set; }
}

在頁面上異步獲取JSON

<button type="button" class="btn btn-primary" id="getJSON">getJSON</button>
<script>
    $("#getJSON").click(function () {
        $.getJSON("Handler1.ashx?r=" + Math.random(), function (data, textStatus) {
            var json = eval(data); //使用eval解析JSON
            for (var i = 0; i < json.length; i++) {
                console.log(json[i].name);
            }
        });
    });
</script>

瀏覽器返回數據以下:

[{"id":1,"name":"嘉文","age":18},{"id":2,"name":"蓋倫","age":28},{"id":3,"name":"趙信","age":38}]

4、$.getScript(url,[callbak])

經過 HTTP GET 請求載入並執行一個 JavaScript 文件,至關於 $.get(url, null, [callback], "script")

<button type="button" class="btn btn-primary" id="getScript">getScript</button>
<button type="button" class="btn btn-primary" id="getScriptCross">跨域調用</button>


<script type="text/javascript">
    //調用同站點內的js文件
    $("#getScript").click(function () {
        $.getScript("bootstrap3.34/js/bootstrap.js", function (data, textStatus) {
            alert(this.url); //返回調用路徑
        });
    });

    //跨域調用js文件
    $("#getScriptCross").click(function () {
        $.getScript("http://cdn.bootcss.com/bootstrap/3.3.4/js/bootstrap.min.js", function (data, textStatus) {
            alert(this.url); //返回調用路徑
        });
    });
</script>

5、$.post(url,[data],[callback],[type])

經過遠程 HTTP POST 請求載入信息,具體操做和get()請求同樣,只是換了個$.post。

6、$.ajax( options )

ajax方法是Jquery Ajax 的底層實現,返回其建立的XMLHttpRequest對象,該方法只有一個參數 key/value 對象。

<button type="button" class="btn btn-primary" id="Ajax">Ajax</button>
<script>
    $("#Ajax").click(function () {
        $.ajax({
            url: "Handler1.ashx",
            type: "get", //默認get
            timeout: "1000", //超時時間毫秒
            async: true, //默認true異步
            beforeSend: function () { //發送請求前執行
                alert("發送請求前執行!");
            },
            cache: false, //不緩存
            complete: function (responseText, textStatus) { //請求成功或失敗均調用,能夠進行一些判斷
                alert(responseText);
            },
            contentType: "application/x-www-form-urlencoded", //application/x-www-form-urlencoded 默認這個報文頭 表單
            data: { id: 1, name: "嘉文" },
            dataType: "html", //返回類型
            error: function (e) {
                alert(e); //返回錯誤信息
            },
            global: true, //默認true 是否觸發全局AJAX事件
            success: function (data, textStatus) { //請求成功後的回調
                alert(textStatus);
                alert(data);
            }
        })
    });
</script>

7、AJAX相關函數

一、$.ajaxSetup( options )

設置全局AJAX默認 options 選項。

ajax方法的全部屬性均可以在此進行設置,設置完畢後,就能夠進行調用無參的get()、post()等方法發送請求。

若是在調用時,指定了某些屬性,將優先使用該屬性,不會衝突。

$.ajaxSetup({
    url: "index1.html",
    global: false,
    type: "post",
    success: function (data) {
        alert(data);
    }
});

$("#test").click(function(){
  $.post(); //會發送到index1.html
});
$(
"#btn").click(function () { $.get("index3.html"); //使用自定義的url 其餘用默認的 });

二、serializer()

有些時候,咱們須要異步提交表單,這是須要本身手動輸入全部參數,使用serializer()方法能夠自動將表單上的元素進行拼接,返回一個參數字符串。

html代碼

<form class="form-horizontal" role="form" style="margin-top:100px;" id="form1">
    <div class="form-group">
        <label class="col-lg-2 control-label">用戶名:</label>
        <div class="col-lg-8"><input type="text" name="userName" placeholder="請輸入用戶名" class="form-control" /></div>
    </div>
    <div class="form-group">
        <label class="col-lg-2 control-label">
            密碼:
        </label>
        <div class="col-lg-8">
            <input type="password" name="passWord" placeholder="請輸入密碼" class="form-control" />
        </div>
    </div>
    <div class="form-group">
        <div class="col-lg-offset-2 col-lg-8">
            <button type="button" class="btn btn-default" id="login">登錄</button>
        </div>
    </div>
</form>

之前你要這麼作

$("#login").click(function () {
    $.post("login.ashx", { userName: $("input[name='userName'").val(), passWord: $("input[name='passWord'").val() }, function () {
        //location.href='index.html';
    });
});

使用方法

$("#login").click(function () {
    $.post("login.ashx", $("#form1").serialize(), function () {
        //location.href='index.html';
    });
});

自動拼接的參數:userName=123123&passWord=123

三、serializeArray()

該方法返回JSON對象。

$("#login").click(function () {
    var objs = $("#form1").serializeArray();
    var str = JSON.stringify(objs); //將json轉換爲字符串
    document.write(str);
});

運行結果

[{"name":"userName","value":"123123"},{"name":"passWord","value":"asd"}]

8、JSONP

JSON with Padding是json的一種使用模式,可讓網頁從別的域名(網站)那獲取資料,即跨域讀取數據。

注意 url?jsoncallback=? Jquery會自動將?編譯爲正確的函數名來執行回調函數。

$("#btn").click(function () {
    $.getJSON("http://www.runoob.com/try/ajax/jsonp.php?jsoncallback=?", function (data) {
        for (var i = 0; i < data.length; i++) {
            alert(data[i]);
        }
    });
});

對應的$.ajax方法查詢手機歸屬地

<p>請輸入手機號<input type="text" id="tel" /></p>
<p>歸屬地:<span id="province"></span></p>
<p>運營商:<span id="operators"></span></p>
<button type="button" id="btn">查詢</button>
<script>
    $("#btn").click(function () {
        $("#province").html("");
        $("#operators").html("");
        var tel = $("#tel").val();
        $.ajax({
            type: "get",
            url: "http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=" + tel,
            dataType: "jsonp",
            jsonp: "callback",
            success: function (data) {
                $("#province").html(data.province);
                $("#operators").html(data.catName);
            },
            error: function (e) {
                alert(e);
            }
        });
    });
</script>
相關文章
相關標籤/搜索