這是一個典型的 B/S 模式。javascript
PS. B/S結構(Browser/Server,瀏覽器/服務器模式),是WEB興起後的一種網絡結構模式,WEB瀏覽器是客戶端最主要的應用軟件。這種模式統一了客戶端,將系統功能實現的核心部分集中到服務器上,簡化了系統的開發、維護和使用。客戶機上只要安裝一個瀏覽器php
B/S 模式前端
這一點很重要
在這張圖中,左側是菜單,很早以前的作法是點擊刷新按鈕會對整個頁面進行刷新,這樣作的弊端是什麼?如何不使用 AJAX 進行局部刷新?java
那麼有什麼辦法能進行數據實時推送(例如股票價格)?jquery
因而誕生了這幾個方法。git
那麼,iframe 最大的缺點是什麼?github
瞭解 AJAX 以前先要了解一下先後端的交互過程。ajax
你們慢慢看……chrome
// 簡單的ajax請求
var xhr = new XMLHttpRequest();// 建立
xhr.onreadystatechange = function() {// onreadystatechange 不是檢測方法,而是狀態改變後更新的狀態
if (xhr.status == 200) {
/* 普及一下經常使用的狀態碼 200:ok,服務器成功返回數據 400:Bad Request,語法錯誤 401:請求須要認證 404:not found,找不到頁面 500:服務器遇到意外錯誤 503:服務器正在維護或者過載沒法完成請求 其餘百度去 */
if (xhr.readyState == 4) {
/* xhr.readyState 是 ajax 狀態 普及一下這個4是什麼意思: 0:建立服務 1:打開服務 2:發送服務 3:服務器響應 4:加載成功 */
var data = JSON.parse(xhr.responseText);// responseText 是返回的文本或對象
}
} else {
// 若是不是正常返回
console.log("數據返回失敗!狀態碼" + xhr.status + "狀態信息:" + xhr.statusText)
// xhr.statusText是瀏覽器的錯誤信息,由於跨瀏覽器的時候,可能不太一致,不建議直接使用它
}
}
xhr.open("post", "list.json?rand="+new Date(), true);// 打開,最後一個 bool 表明是否異步,這一步僅僅只配置了 ajax 的基本信息,而並無對服務器請求
// rand=new Date()是爲了讓每一次請求 url 都不一樣,用來區分緩存
xhr.setRequestHeader("Content-Type","application/www-x-form-urlencoded");
xhr.send(null);// 向服務器發送請求
複製代碼
jQuery 的 ajax 實際上就是封裝了上面的代碼json
$.ajax({
type:"get",
dataType: "json",
url: url,
async: true,
success: function(){},
error: function(){}
})
下面用 chrome 和 Firefox 來演示跨域問題。
複製代碼
編號 | url | 說明 | 是否容許通訊 |
---|---|---|---|
1 | http://www.a.com/a.js http://www.a.com/b.js |
同一域名下 | 容許 |
2 | http://www.a.com/a/a.js http://www.a.com/b/b.js |
同一域名不一樣文件夾 | 容許 |
3 | http://www.a.com:8080/a.js http://www.a.com:9090/a.js |
同一域名不一樣端口號 | 不容許 |
4 | http://www.a.com/a.js https://www.a.com/b.js |
同一域名不一樣協議 | 不容許 |
5 | http://www.a.com/a.js http://192.168.4.158/b.js |
域名與域名對應的ip地址 | 不容許 |
6 | http://www.a.com/a.js http://github.a.com/b.js |
主域名相同,子域名不一樣 | 不容許 |
7 | http://www.a.com/a.js http://a.com/b.js |
同一域名,不一樣二級域名(同上) | 不容許(cookie這種狀況下也不容許訪問) |
8 | http://www.a.com/a.js http://www.b.com/b.js |
不一樣域名 | 不容許 |
www.a.com/sever.php
)和B(www.b.com/sever.php
)各有一個服務器,A的後端(www.a.com/sever.php
)直接訪問B的服務,而後把獲取的響應值返回給前端。這種代理屬於後臺的技術,因此不展開敘述。//建立一個script元素
var Scr = document.reateElement('script');
//聲明類型
Scr.type='text/javascript';
//添加src屬性,引入跨域訪問的url
Scr.src=url;
//在頁面中添加新建立的script元素
document.getElementsByTagName('body')[0].appendChild(Scr)
複製代碼
$.ajax({
url: 'http://192.168.1.114/yii/demos/test.js', //不一樣的域
type: 'GET', // jsonp模式只有GET是合法的
data: {
'action': 'aaron'
}, // 預傳參的數組
dataType: 'jsonp', // 數據類型
jsonp: 'backfunc', // 指定回調函數名,與服務器端接收的一致,並回傳回來
})
複製代碼
整個流程就是:
客戶端發送一個請求,規定一個可執行的函數名(這裏就是jQuery作了封裝的處理,自動幫你生成回調函數並把數據取出來供success屬性方法來調用,不是傳遞的一個回調句柄),服務端接受了這個backfunc函數名,而後把數據經過實參的形式發送出去
其實就是jquery內部會轉化成http://192.168.1.114/yii/demos/test.js?backfunc=jQuery2030038573939353227615_1402643146875&action=aaron
而後動態加載 <script type="text/javascript" src="http://192.168.1.114/yii/demos/test.js?backfunc=jQuery2030038573939353227615_1402643146875&action=aaron"></script>
「XHR2」 全稱 「XMLHttpRequest Level2」 是HTML5提供的方法,對跨域訪問提供了很好的支持,而且還有一些新的功能。
IE10如下的版本都不支持
只須要在服務器端頭部加上下面兩句代碼:
header( "Access-Control-Allow-Origin:*" );
header( "Access-Control-Allow-Methods:POST,GET" );