JQuery 的跨域方法 可跨任意网站
JS的跨域問題,很多人在網上找其解決方法,教其用IFRAME去解決的文章很多,真有那么復雜嗎?其實很簡單的,如果你用JQUERY,一個GETJSON方法就搞定了,而且是一行代碼搞定。
下面開始貼出方法。
//跨域(可跨所有域名)$.getJSON("http://user.hnce.com.cn/getregion.aspx?id=0&jsoncallback=?",function(json){//要求遠程請求頁面的數據格式為: ?(json_data) //例如://?([{"_name":"湖南省","_regionId":134},{"_name":"北京市","_regionId":143}])alert(json[0]._name);});意,getregion.aspx中,在輸出JSON數據時,一定要用Request.QueryString["jsoncallback"],將獲取的內容放到返回JSON數據的前面,假設實際獲取的值為42342348,那么返回的值就是 42342348([{"_name":"湖南省","_regionId":134},{"_name":"北京市","_regionId":143}])
因為getJSON跨域的原理是把?隨機變一個方法名,然后返回執行的,實現跨域響應的目的。
具體getJSON的使用說明,請參考JQUERY手冊。需要指出的一點是getJSON利用的jsonp需要客戶端與服務端作出配合。
不出意外的話應該已經可以跨域讀取了。
同時輸出json數據時候{之前的是(
下面一個是跨域執行的真實例子:
<script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"></script> <script type="text/javascript"> //跨域(可跨所有域名)$.getJSON("http://e.hnce.com.cn/tools/ajax.aspx?jsoncallback=?", { id: 0, action: 'jobcategoryjson' }, function(json) {alert(json[0].pid);alert(json[0].items[0]._name);}); </script>jquery 的ajax 默認是異步的, 跨域用同步試,ajax jsonp
?
========================
?
?注意這里調用的地址中jsoncallback=?是關鍵的所在!其中,符號會被Query自動替換成其他的回調方法的名稱,具體過程和原理我們這里不理 會。我們關心的是jsoncallback=?起什么作用了?原來jsoncallback=?被替換后,會把方法名稱傳給服務器。我們在服務器端要做什 么工作呢?服務器要接受參數jsoncallback,然后把jsoncallback的值作為JSON數據方法名稱返回,比如服務器是JSP,我們會這 樣做:
?
????? ...
????? String jsoncallback=request.getParameter("jsoncallback");
????? ...
????? out.print(jsoncallback+"({\"account\":\"XX\",\"passed\":\"true\",\"error\":\"null\"})");
?
Jquery取得的數據可能如下:
????? JQUET0988788({"account":"XX","passed":"true","error":"null"})
?
總結,用JSONP要做兩件事:
????? 1/請求地址加參數:jsoncallback=?
????? 2/服務器段把jsoncallback的值作為方法名傳回來,如JQUET098788(...)
jQuery中跨域訪問的核心原理:JS文件注入,因為因為script標簽的src屬性是可以跨域的,利用script標簽的src屬性直接返回非本域名下的數據,具體采用的方式稱為:jsonp。
代碼:
?
test.html,例如位于 www.qq.com<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>jQuery-跨域請求</title><script type="text/javascript" src="/js/jquery.js"></script></head><script type="text/javascript">jQuery(document).ready(function(){$.ajax({type : "GET",url : "http://www.b.com/server.php&action=getmsg&callback=?",dataType : "jsonp",jsonp: 'callback',success : function(json){$('#msg_box').html(json.msg);return true;}});});</script><body><div id="msg_box"></div></body></html>server.php,例如位于www.baidu.com<?php$action = $_GET['action'];$callback = $_GET[callback ];if ($action){echo "{$callback}({"msg":"this is a jquery jsonp test message!"})";exit();}else{echo "{$callback}({"msg":"error action!"})";exit();}?> View Code?
url 被寫成了http://active.zol.com.cn/guofeng/profile2.php?callback=?,需要說明的是,這個問號會被 jQuery 自動替換為回調函數的函數名(如果是一個匿名函數,JQuery 會自動生成一個帶時間戳的函數名)。
總結下JSONP原理:
首先在客戶端注冊一個callback, 然后把callback的名字傳給服務器。
此時,服務器先生成 json 數據。?
然后以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的參數 jsonp.
最后將 json 數據直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。
客戶端瀏覽器,解析script標簽,并執行返回的 javascript 文檔,此時數據作為參數,傳入到了客戶端預先定義好的 callback 函數里.(動態執行回調函數)
?
?
轉:http://www.cnblogs.com/taven/archive/2010/05/20/1739731.html
?http://www.cnblogs.com/5201314/archive/2009/06/23/1509552.html
轉載于:https://www.cnblogs.com/love201314/p/5150448.html
總結
以上是生活随笔為你收集整理的JQuery 的跨域方法 可跨任意网站的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Debian 升级到 PHP 7,并支持
- 下一篇: List接口实现类-ArrayList、