一、有src的标签

说明:所有具有src属性的HTML标签都是可以跨域的,包括<img>,<script>。

限制:需要创建一个DOM对象,只能用于GET方法。

document.bodyappend一个具有src属性的HTML标签,src属性值指向的URL会以GET方法被访问,该访问是可以跨域的。

其实样式表的<link>标签也是可以跨域的,只要是有src或者href的HTML标签都有跨域的能力。

不同的HTML标签发送HTTP请求的时机不同

例如<img>在更改src属性时就会发送请求,而script,iframe,link[rel=stylesheet]只有在添加到DOM树之后才会发送HTTP请求:

var img = new Image();
img.src = 'http://some/picture';        // 发送HTTP请求

var ifr = $('<iframe>', {src: 'http://b.a.com/bar'});
$('body').append(ifr);                  // 发送HTTP请求

二、JSONP

jsonp是JSON with padding的简写,看起来与json差不多,但是包含在函数调用中的json,利用动态script元素来使用(具有src属性的如img,iframe,srcipt都不受同源策略的影响)。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

如果使用jquery,可以在type为get的时候dataType设为jsonp,就可以了。例如:

$.ajax({
        url: 'http://www.qdaily.com/get_user_and_radar.json?winWidth=1280&winHeight=800',
        type: 'get',
        dataType: 'jsonp',
        data: {},
    })
    .done(function(data) {
        console.log(data.status);
    })

$.getJSON$.get的区别是前者会把responseText转换为JSON,而且当URL具有callback参数时, jQuery将会把它解释为一个JSONP请求,创建一个<script>标签来完成该请求。+

【总结下jsonp】:

  • 优点: 简单,函数回调在本地处理;
  • 缺点:

  • 安全性(存在注入漏洞,如CSRF,XSS);

  • 如果出现错误,不会像http请求那样有状态码; 3、只能使用get请求;

results matching ""

    No results matching ""