要讨论的是浏览器端的真正跨域访问,推荐的是目前jQuery $.ajax()支持get方式的跨域,这其实是采用jsonp的方式来完成的.
//jsonp 方式 beforeSend 与 error 方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了
$.ajax({
async : false,
url : '跨域URL',
type : "GET",
dataType : 'jsonp',
jsonp : 'callback',
data : {
q : '参数,不多说'
},
timeout : 5000,
success : function(json) {
//客户端jquery预先定义好的callback函数,
//成功获取跨域服务器上的json数据后,会动态执行这个callback函数
if (json.xx) {
alert(json.xx);
}
}
});
//还有一种方式是上例$.ajax({..}) api的一种高级封装,对有些$.ajax api底层的参数就被封装而不可见了.
$.getJSON("跨域URL?q=" + value + ";jsoncallback=?",
function(json) {
if (json.属性名 == 值) {
// 执行代码
}
});
jsonp的最基本的原理是:
动态添加一个<script type=”text/javascript”></script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了. 这样其实”jQuery AJAX跨域问题”就成了个伪命题了,jquery $.ajax方法名有误导人之嫌. 如果设为dataType: ‘jsonp’, 这个$.ajax方法就和ajax XmlHttpRequest没什么关系了,取而代之的则是JSONP协议. JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。
另:
JSONP跨域请求数据报错 “Unexpected token :”的解决办法
(一) 正常的JqueryAajx跨域请求:
返回数据json串,不做处理直接返回,不多说
(二) Jquery Jsonp请求
返回的json串要修改一下: callback( strJson );
例:正常的JqueryAajx跨域请求返回参数
String strJson = "[{"id":"111"},{"id":"222"}]" ,正常返回不做处理。
jsonp请求应做如下处理
String callback = getParameter("callback");
String strJson = "[{"id":"111"},{"id":"222"}]"
strJson = callback.concat("(").concat(strJson).concat(")")
返回 strJson;