$.getJSON()跨域之原理

前端之家收集整理的这篇文章主要介绍了$.getJSON()跨域之原理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

/*可以跨域请求数据*/

其原理是对<script>装载的服务端数据用全局函数(callback)操作

首先写个简单示例:(jsonpCallback可动态创建注册成全局函数)

<scripttype="text/javascript">
varm=Math.random();
varjsonpCallback=newFunction("result","alert(result.data);");
</script>
<scripttype="text/javascript"src="http://localhost/json.PHP?jsonp=jsonpCallback"></script>

服务端:

<?PHP
echo"jsonpCallback({data:'jsondata'})";

会弹出:jsondata


$.get(url,params,callback)

与$.post请求方法一样,只是请求类型不同

返回的是字符格式,可以用$.evalJSON()方法进行转换格式

然后对JSON对象进行操作


$.getJSON(url,callback)

返回JSON对象,跨域示例如下:



  1. <?PHP

  2. functiongetdata()

  3. {

  4. $.getJSON(

  5. "http://www.test.com/payment/payment/paytest?callback=?",

  6. {id:1,name:"name"},

  7. function(jsondata){

  8. alert(jsondata.json);

  9. });

  10. }


  11. 翻开jquery.的源码,一步步找:


  12. getJSON:function(url,data,callback){

  13. returnjQuery.get(url,callback,"json");

  14. }


  15. 再找JQuery.get


  16. get:function(url,type){

  17. //shiftargumentsifdataargumentwasomited


  18. if(jQuery.isFunction(data)){

  19. type=type||callback;

  20. callback=data;

  21. data=null;

  22. }


  23. returnjQuery.ajax({

  24. type:"GET",

  25. url:url,

  26. data:data,

  27. success:callback,

  28. dataType:type

  29. });

  30. }


  31. 再找jQuery.ajax


  32. jQuery.ajax({

  33. url:url,

  34. type:type,

  35. dataType:"html",

  36. data:params,

  37. complete:function(res,status){

  38. //Ifsuccessful,injecttheHTMLintoallthematchedelements

  39. if(status==="success"||status==="notmodified"){

  40. //Seeifaselectorwasspecified

  41. self.html(selector?

  42. //Createadummydivtoholdtheresults

  43. jQuery("<div/>")

  44. //injectthecontentsofthedocumentin,removingthescripts

  45. //toavoidany'PermissionDenied'errorsinIE

  46. .append(res.responseText.replace(rscript,""))


  47. //Locatethespecifiedelements

  48. .find(selector):


  49. //Ifnot,justinjectthefullresult

  50. res.responseText);

  51. }


  52. if(callback){

  53. self.each(callback,[res.responseText,status,res]);

  54. }

  55. }

  56. });


  57. returnthis;

  58. }


  59. 再找ajax方法,揭开秘密要来了:


  60. 由于太多,帖开头部分,有兴趣的同学自己去看下


  61. ajax:function(origSettings){

  62. vars=jQuery.extend(true,{},jQuery.ajaxSettings,origSettings);


  63. varjsonp,

  64. callbackContext=origSettings&&origSettings.context||s,

  65. type=s.type.toUpperCase();


  66. //convertdataifnotalreadyastring

  67. if(s.data&&s.processData&&typeofs.data!=="string"){

  68. s.data=jQuery.param(s.data,s.traditional);

  69. }


  70. 比较重要的一部分:


  71. http://localhost/index/ajax?callback=jsonp1274437815229&id=1


  72. 服务器判断是否有这个callback参数,如果有就返回JS函数名+对象


  73. //jsonp=jsonp1274437815229(请求地址的回调参数)


  74. //jsonp全局函数

  75. window[jsonp]=window[jsonp]||function(tmp){

  76. data=tmp;

  77. success();

  78. complete();

  79. //Garbagecollect

  80. window[jsonp]=undefined;

猜你在找的Json相关文章