jquery jsonp的請(qǐng)求數(shù)據(jù):
$.Ajax({ dataType : "JSONP", jsonp : "callback",//請(qǐng)求自動(dòng)帶上callback參數(shù),callback值為jsonpCallback的值 jsonpCallback : "test1",//接口服務(wù)器應(yīng)該返回字符串?dāng)?shù)據(jù)格式:test1(JSON數(shù)據(jù)) type : "POST", url : "http://www.xiuye.com/josnp.do",//接口服務(wù)器地址 data : { /* user : "xiuye" */ },//請(qǐng)求數(shù)據(jù) success : function(response) { //成功執(zhí)行 console.log(response); //alert("jsonp OK"); }, error : function(e) { //失敗執(zhí)行 alert(e.status + ',' + e.statusText); } });服務(wù)器端傳回的數(shù)據(jù)實(shí)際上是字符串:test1(json數(shù)據(jù))瀏覽器得到 : json數(shù)據(jù)這個(gè)過程中callback的test1是什么?
test1可能是個(gè)函數(shù),函數(shù)定義是用eval定義的:
eval("function " + callback + "{...}");注:callback = "test1"然后test1的函數(shù)就定義成功了
==================跨域請(qǐng)求==================
標(biāo)簽script的src屬性可以請(qǐng)求任何地址.
jsonp:
先動(dòng)態(tài)的定義新的callback函數(shù)test1
eval("function test1{...}");請(qǐng)求數(shù)據(jù)
<script src="http://www.xiuye.com/josnp.do?callback=test1"></script>server得到callback的參數(shù),返回字符串:"test1(json數(shù)據(jù))"瀏覽器的script得到數(shù)據(jù)后就執(zhí)行js代碼:test1(json數(shù)據(jù))這樣json數(shù)據(jù)就可以通過全局變量或者其他方式拿到手了.動(dòng)手實(shí)踐:
前端js代碼:
<script type="text/javascript" src="js/jquery-2.1.4.js"></script><script type="text/Javascript"> var a = null; function test(callback) { console.log("execute test ..."); window.eval("function " + callback + "(data){a = data;alert('jsonp callback 函數(shù)已經(jīng)執(zhí)行了!')}"); var s = document.createElement("script"); s.src = "http://www.xiuye.com/josnp.do?callback=" + callback + "&_=" + Math.random(); document.body.appendChild(s); console.log(s); } $(function(){ test("test1"); console.log("global a = " + a); });</script>服務(wù)器java代碼返回json數(shù)據(jù)(用了jsonp框架才出現(xiàn)下面的樣子,直接返回?cái)?shù)據(jù)):public String test1(){ return "{msg : 'json no parameter'}"; }結(jié)果:
新聞熱點(diǎn)
疑難解答
圖片精選