觀察函數
ajaxStart 和 ajaxStop 函數可以用來作為觀察函數,我們可以使用觀察函數的回調函數來做相應的處理。
當 Ajax 請求開始且尚未進行其他傳輸時,會觸發 ajaxStart 的回調函數。
當最後一次活動請求終止時,則會執行通過 ajaxStop 注冊的回調函數。
由於觀察函數具備全局性,所以需要使用 $(document) 來調用。我們通過使用 Ajax 方法取得一個圖片的例子來測試兩個函數:
當前頁面為:
<div></div> <button>load</button>
同目錄下的 test.html 內容為:
<img src="avatar.jpg" />
點擊按鈕後希望載入圖像:
$('button').click(function() { $('div').load('test.html'); });
此時我們可以使用 ajaxStart 和 ajaxStop 函數來增加提示:
$(document).ajaxStart(function() {// alert('load a picture'); }).ajaxStop(function() { alert('show a picture'); }); $('button').click(function() { $('div').load('test.html'); });
此時點擊按鈕後,再圖像載入前先提示 load a picture,載入後提示 show a picture。
錯誤處理
最常用的方式是全局的 ajaxError 方法,以上例為例,如果我們像一個不存在的頁面發送數據請求:
$(document).ajaxError(function() {// alert('load failed!'); }); $('button').click(function() { $('div').load('noexsited.html'); });
此時點擊按鈕後:
對於非 load 方法,還可以使用 fail 方法來連綴處理:
$('button').click(function() { $.get('noexsited.html', function(data) { }).fail(function(jqXHR) { alert('status is ' + jqXHR.status); }); });
JSONP
JSONP 即 JSON with padding,填充式 JSON,利用的是 <script> 標簽可以跨域獲取 Javascript 文件的思路,故可以跨域獲取 JSON 數據。
JSONP 的格式是把標准 JSON 文件包裝在一對圓括號中,圓括號又前置一個任意字符串。這個字符串,即所謂的 P,由請求數據的客戶端來決定。
同樣是上例的按鈕,首先我們將外域頁面 otherdomain.com/index.php 內容設置為:
<?php $data = '{ "name": "stephenlee", "sex": "male" }'; echo $_GET['callback'] .'('. $data .')';
我們使用特殊的占位符 ? 來實現跨域獲取 JSON 數據:
$('button').click(function() { $.getJSON('otherdomain.com/index.php?callback=?', function(data) { console.log(data); }); });
數據獲取成功。