我們知道ajax本身實際上是通過XMLHttpRequest對象來非同步進行資料的互動,而瀏覽器出於安全考慮,不允許js代碼進行跨網域作業,所以js跨網域作業會被拒絕。
具體情況有:
一、本域和子域的相互訪問: http://www.aa.com/和book.aa.com
二、本域和其他域的相互訪問: http://www.aa.com/和http://www.bb.com/ 用 iframe
三、本域和其他域的相互訪問: http://www.aa.com/和http://www.bb.com/ 用 XMLHttpRequest訪問代理
四、本域和其他域的相互訪問: http://www.aa.com/和http://www.bb.com/ 用 JS建立動態指令碼
今天主要討論第4中解決方案,這個和上個的區別就是請求是使用<script>標籤來請求的,這個要求也是兩個域都是由你來開發才行。原理就是JS檔案注入,在本域內的a內產生一個JS標籤,它的SRC指向請求的另外一個域的某個頁面b,b返回資料即可,可以直接返回JS的代碼。因為script的src屬性是可以跨域的。
這裡我們需要用到JQuery.getScript(url, callback)方法,url是指令檔的URL路勁,callback函數在指令碼資源已被載入和求值後調用的回呼函數。
首先在bb.com建立一個js檔案,test.js
1 var ojb = {msg:'js跨域請求成功'};
然後在aa.com的頁面上使用$.getScript載入test.js指令碼
1 $(function() {
2 $.getScript('http://www.bb.com/test.js', function() {
3 if (ojb) {
4 alert(obj.msg);
5 }
6 });
7 });
使用$.getScript函數的最大好處就是可以保證,指令碼載入完畢後調用回呼函數。
個人感覺這種方法比使用代理和iframe要簡單一些。