受限于浏览器的同源安全策略, js 无法发起跨域的请求. 但是 HTML 中的 <script> 标签却可以引入跨域的文件使用. 而 JSONP 就是利用 <script> 的开源策略解决跨域问题的一种 JSON 的使用模式.

JSONP 抓取到的数据并不是 JSON, 而是任意可执行的 JS 代码.

JSONP 应用

服务器端代码

<?php
$info = ['type' => 'jsonp', 'msg' => '服务器端数据'];
$info = json_encode($info, JSON_UNESCAPED_UNICODE);
$callback = $_GET['jsonpCallback'];
// 此处相当于直接返回一句js代码: showData({type: "jsonp", msg: "服务器端数据"})
echo "{$callback}({$info})";

客户端代码

<script type="text/javascript">
function showData(data)
{
console.log(data);
}
</script>
// 获取到返回的js后开始执行
<script type="text/javascript" src="http://127.0.0.1:88/JSONP/getData?jsonpCallback=showData"></script>

上面的客户端代码在执行时等于:

<script type="text/javascript">
function showData(data)
{
console.log(data);
}
</script>
<script type="text/javascript">
showData({type: "jsonp", msg: "服务器端数据"})
</script>

JQuery 下的 JSONP 实现

客户端代码

服务器端代码不变, 客户端代码替换为:

<script type="text/javascript">
$.ajax({
url: 'http://127.0.0.1:88/JSONP/getData?jsonpCallback=showData',
type: 'get',
data: null,
dataType: 'jsonp',
async: false,
success: function(data)
{
console.log(data);
},
error: function(){}
}); function showData(data)
{
console.log(data);
}
</script>

或是

<script type="text/javascript">
$.ajax({
url: 'http://127.0.0.1:88/JSONP/getData',
type: 'get',
data: null,
dataType: 'jsonp',
jsonpCallback: 'showData', // 定义回调函数名, 没有此项, jQuery将提供一个随机函数名, 后端通过$_GET['callback']获取回调函数名
async: false,
success: function(data)
{
console.log(data);
},
error: function(){}
}); function showData(data)
{
console.log(data);
}
</script>

  

JSONP 应用的更多相关文章

  1. 实例操作JSONP原理

    絮语:按这个步骤走,你就会明白JSONP是什么鬼. 1.工程目录: ng-mywork demo.html test.js 2.nginx的server配置 server { listen ; ser ...

  2. angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流

    大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp.URLSearchParams.observable中断选择数据流的用法. 例子

  3. 疯狂的JSONP

    何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? 跨域 就是由于JavaScript同源策略的限制,使得a.com域名下的js无法操作b.com或c.a.com域名下 ...

  4. 通过扩展让ASP.NET Web API支持JSONP

    同源策略(Same Origin Policy)的存在导致了"源"自A的脚本只能操作"同源"页面的DOM,"跨源"操作来源于B的页面将会被拒 ...

  5. 跨域的jsonP

    1.出现原因:因为web中的同源策略(域名,协议,端口号)限制了跨域访问.   2.区别于json (个人理解)json是数据交换格式,jsonp是数据通信中的交互方式   3.jsonp的get与p ...

  6. ASP.NET Web API 配置 JSONP

    之前的一篇博文:jsonp跨域+ashx(示例) 1. 安装 Jsonp 程序集: PM> Install-Package WebApiContrib.Formatting.Jsonp PM&g ...

  7. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  8. 跨域之jsonp

    我们都知道使用<script>标签可以引入外部的JS文件,即使这个JS文件来自于其他的网站,比如我们引用存放在网络服务器上的jQuery框架.在这个过程中,我们已经实现跨域访问.像< ...

  9. 由浅入深学习ajax跨域(JSONP)问题

    什么是跨域?说直白点就是获取别人网站上的内容.但这么说貌似又有点混淆,因为通常我们用ajax+php就可以获取别人网站的内容,来看下面这个例子. 来看看跨域的例子,jquery+ajax是不能跨域请求 ...

  10. JSONP的诞生、原理及应用实例

    问题: 页面中有一个按钮,点击之后会更新网页中的一个盒子的内容. Ajax可以很容易的满足这种无须刷新整个页面就可以实现数据变换的需求. 但是,Ajax有一个缺点,就是他不允许跨域请求资源. 如果我的 ...

随机推荐

  1. POJ 1651 Multiplication Puzzle 区间dp(水

    题目链接:id=1651">点击打开链 题意: 给定一个数组,每次能够选择内部的一个数 i 消除,获得的价值就是 a[i-1] * a[i] * a[i+1] 问最小价值 思路: dp ...

  2. struts <s:iterator>两个list嵌套循环,对象属性交叉使用

    两个list:List<CreateTableColumn> createTableColumnList,List<Map<String, Object>> tab ...

  3. BZOJ 3041 水叮当的舞步

    3041: 水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 120  Solved: 67[Submit][Status][Discuss ...

  4. height not divisible by 2

    height not divisible by 2 h.264 - FFMPEG (libx264) "height not divisible by 2" - Stack Ove ...

  5. 多台Mac电脑使用同一个apple开发者账号测试

    因为公司有苹果一体机,家里有macbook和黑苹果台式机,多台电脑用同一个开发者账号,每次真机调试时都是选择直接reset,回到另外一台电脑,又要重新设置,太麻烦了.直到最近才设置三台电脑都可以,分享 ...

  6. http访问方式

    package com.m.billingplug.util; import java.io.IOException; import java.net.UnknownHostException; im ...

  7. 最长回文子串问题 O(n)算法 manacher URAL1297 HDU3068

    先来看一道简单的题,ural1297 给定一个1000长度的字符串,求最长回文子串. 看起来很Naive,乱搞一下,O(n^2)都可以解决. 再来看这个题 HDU3068 120个110000长度的字 ...

  8. bzoj1597 [Usaco2008 Mar]土地购买——斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 就是斜率优化水题... 然而WA了十几遍,正负号处理真让人心累... 还是该负就负,别 ...

  9. JForum论坛添加UEditor文本编辑器

    在使用JForum论坛中发现论坛自带的文本编辑器不好用,不能上传图片,样式编辑也很麻烦,就想着把这个文本编辑器替换掉,我这里选用的是百度的开源富文本编辑器UEditor 替换后的效果图 替换方法如下 ...

  10. CodeForces 731B Coupons and Discounts (水题模拟)

    题意:有n个队参加CCPC,然后有两种优惠方式,一种是一天买再次,一种是买两天,现在让你判断能不能找到一种方式,使得优惠不剩余. 析:直接模拟,如果本次是奇数,那么就得用第二种,作一个标记,再去计算下 ...