利用了script src没有同源限制,进行跨域请求。
例如,www.a.com 想请求 www.b.com 的内容php
//a网站的请求页: <script> function jsonp(json){ //对返回的json数据的处理 } </script> <script src="http;//www.b.com/jsonp.js"></script> //b网站的jsonp.js 响应页 jsonp({'name':'amy',age:22})
a网站定义jsonp的回调处理。jquery
a网站jsonp跨域请求ajax
b网站使用a网站的同名函数处理跨域请求json
以上即是js的jsonp实现跨域,其实它和ajax
的XHR对象
并无任何关系,因为jquery 把jsonp的实现封装在了ajax
中,因此jsonp
和ajax
常常同时被提起.后端
$.ajax({ type: "GET", url: "http://www.b.com/jsonp.js" dataType: "json", success: function(data) { //对data的处理 }, error: function(jqXHR){ alert("发生错误:" + jqXHR.status); }, });
若是不使用jsonp会有跨域报错。跨域
$.ajax({ type: "GET", url: "http://www.b.com/jsonp.js" dataType: "jsonp", jsonp:"callback",//“callback”:任意名字均可以 success: function(data) { //对data的处理 }, error: function(jqXHR){ alert("发生错误:" + jqXHR.status); }, });
加上获取请求的处理:服务器
$jsonp = $_GET["callback"];//callback名字和请求的名字相同
2.返回参数以前加上$jsonp, 并用()将参数括住,以php后端为例:函数
//原来:$result ='{"success":true,"msg":"找到员工:员工编号:' . $value["number"] .'"}'; //改成: $result =$jsonp . '({"success":true,"msg":"找到员工:员工编号:' . $value["number"] .'"})';
ajax的处理把在get请求后追加了callback
参数,并给她赋予了参数值
,响应值追加了callback的参数值
。jsonp
jsonp仅支持get请求网站
XHR2(XMLHttpRequest Level 2)
只需在服务器端设置两个参数便可:
header('Access-Control-Allow-Origin:*');//容许跨域请求的域名,容许所有设为* header('Access-Control-Allow-Methods:POST,GET');