jsonp

  由于浏览器中的同源策略,不同的域名,不同的协议,甚至不同的端口都无法请求数据。因此出现了浏览器跨域请求数据问题。

  Jsonp是解决跨域问题的一个非常流行的方法。

  JSONP(JSON with Padding),其实就是被包裹在函数调用中的JSON。

callback({"name": "Kate"});

  1. JSONP原理

  通过script标签进行跨域操作,载入的请求js文件中的内容会执行我们在url中指定的函数,并且,传入的参数,就是我们请求的数据。

  2. JSONP简单实现

 1 <script>
 2 // 先定义我们将要处理数据的函数
 3 function myFun(data) {
 4     console.log(data);
 5 }
 6 </script>
 7
 8 <!-- 我们使用script标签来进行跨域请求,并使用callback标明我们将要处理数据的函数 -->
 9 <!-- 此处我使用的是聚合数据的数据资源 -->
10 <script src="http://v.juhe.cn/expressonline/getCarriers.php?key=6a1038e454e6d4b25457b911c8d9b815&callback=myFun"></script>

最终显示为:

我们成功获取不同域名下的资源。并通过自定义的myFun函数将获得的数据打印出来了。

  3. 简单实现jQuery中jsonp

  在使用jsonp过程中,可能因为请求数据的API要求不同,我们需要构建自己的jsonp方法,下面我们简单介绍一种类似jQuery中jsonp的实现。

  首先,我们创建一个以jQuery开头的随机的函数名,并将其挂载到window对象中。在这个函数中,我们调用我们传入的回调函数处理数据。

  然后,我们开始处理传入的url,此时,我们规定传入的url不带有callback查询字符串,方便我们根据不同的API要求传入对应的参数。

  最后,我们创建script标签,并指定其src为前面处理好的url,将其添加到文档中,即可获取数据。

 1 <script>
 2 // 自定义框架名称myFrame
 3 var myFrame = {};
 4
 5 // 添加jsonp方法
 6 myFrame.jsonp = function(url, callback) {
 7     // 生成随机函数名
 8     var cbname = ‘jQuery‘ + new Date().getTime();
 9
10     // 把cbname作为函数名挂载到window对象上
11     window[cbname] = function(data) {
12         // 调用传入的回调函数处理数据
13         callback(data);
14
15         // 调用数据之后,删除创建的script标签
16         // 放置script标签无限增长
17         document.body.removeChild(script);
18     }
19
20     // 拼接url,将callback添加到url中,
21     // 如:http://api.douban.com/v2/movie/in_theaters?callback=;jQuery1487687886270
22     url += url.indexOf(‘?‘) == -1 ? ‘?‘ : ‘&‘;
23     url += ‘callback=‘ + cbname;
24
25     // 创建script标签
26     var script = document.createElement(‘script‘);
27     // 添加script标签属性
28     script.src = url;
29     script.type = ‘text/javascript‘;
30
31     // 将script标签添加到文档中,此时开始请求我们的数据
32     document.body.appendChild(script);
33
34 }
35
36 // 调用框架中的方法,此时使用豆瓣API
37 myFrame.jsonp(‘http://api.douban.com/v2/movie/in_theaters‘, function(data) {
38     console.log(data);
39 });
40 </script>

成功请求到数据:

script标签请求到的内容:

时间: 2024-08-06 15:38:36

jsonp的相关文章

原生jsonp跨域

<script> // jsonp跨域原生写法 var script = document.createElement('script'); script.src = 'http://192.168.7.16/kuayu/test02.php?callback=aa'; document.body.appendChild(script); //aa('后台数据') function aa(res) { alert(res.website); } </script>

跨域cors方法(jsonp,document.domain,document.name)及iframe性质

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对 http://store.company.com/dir/page.html 同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法: 1.通过jsonp跨域[解决ajax跨域] 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的

jsonp跨域

1 (function(window, document, undefined) { 2 'use strict'; 3 var jsonp = function(url, data, callback) { 4 var fnSuffix = Math.random().toString().replace('.', ''); 5 var cbFuncName = 'my_json_' + fnSuffix; 6 window[cbFuncName] = callback; 7 var quer

JSON JSONP ajax

JSON 是一种数据格式 不是数据类型 也不是编程语言  JSON: JavaScript对象表示法 (JavaScript Object  Nonation)  与XML类似 比xml更小 更快 更易解析 JSONP :JSON+Padding (内填充)   把JSON当作内容添加到一个盒子里    用于 跨域              callback参数 什么是JSONP 首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中.JSON格式数据的编码

说一说javascript跨域和jsonp

同源策略 在浏览器的安全策略中“同源策略”非常如雷贯耳,说的是协议.域名.端口相同则视为同源,域名也可换成IP地址,不同源的页面脚本不能获取对方的数据. 要是想使用XMLHttpRequest或者常规的AJAX请求获取另一个站点的数据,浏览器会告诉你“XXXX is not allowed by Access-Control-Allow-Orign”. 因为同源策略的存在,防止了跨域访问的安全问题,但同时也损失了方便获取资源的便利. 跨域的src属性 世事又非绝对,浏览器还是允许几个元素跨域访问

jquery ajax跨域的完美解决方法(jsonp方式)

ajax跨域请求的问题,JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式,接下来为大家详细介绍下客户端JQuery.ajax的调用代码 今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题,隐约记得Jquery有提过一个ajax跨域请求的解决方式,于是即刻翻出Jquery的API出来研究,发 JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的 jquery.ajax jsonp格式和jquer

jsonp的使用

假设我们已经了解什么是同源策略,以及什么是浏览器的同源策略的限制. 现在我们需要在a.demo.com下的某个页面one.html 里加载不同域b.demo.com下的json数据. 我们都知道用<script>或者<img>标签的src属性是可以跨域从某个站点加载数据的,jsonp就是根据这个原理来实现. 我们同样也知道,当浏览器加载完<script>标签的内容之后,它会立即执行.所以为了不让浏览器报错,这些内容应该是一些变量的定义或者是函数的调用之类的东西. 但是,

Jquery调用从ashx文件返回的jsonp格式的数据处理实例

开发环境:vs2010+jquery-1.4.min.js 解决问题:网上代码比较少,好多调试不通,返回数据不用json而用jsonp主要考虑解决跨域问题 开发步骤:打开VS2010,新建一web站点,保存位置选择D:\Website1;添加新项,选择一般处理程序,命名cmdHandler.ashx;添加新项,选择HTML页,命名为testAshx.htm;网上下载jquery-1.4.min.js拷贝到web站点中 项目相关网站源码和运行截图如下: 1.testAshx.htm代码如下: <!

谈谈怎么使用JSONP

JSONP是什么,其实它是目前主流的实现跨域通信的解决方案. 因为我们都知道,在我们使用ajax去发起HTTP请求的时候,是不可以跨域的.也就是不能在不同域名下.端口等去请求.如果我们强行这么做的话,它是会报错. 这里举个例子. function createXHR() { var xhr = new XMLHttpRequest(); return xhr; } function ajax(url) { var xhr = createXHR(); xhr.onreadystatechange