1 .关于jsonp的原理等,请看下面的文章,说的很明白.

http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html#top

以及

http://www.cnblogs.com/yuzhongwusan/archive/2012/12/11/2812849.html

2 .本文主要探讨在jquery中如何快速的使用jsonp

服务器端脚本: json_r01.php

 <?php

 $callback = $_REQUEST['callback'];

 $arr = array();
$arr['newYear'] = $_REQUEST['year'] + 6;
$arr['msg'] = $_REQUEST['name'] . '测试信息'; //json编码
$json = json_encode($arr); //返回一个调用函数的字符串: 例如 test({'name': 'lucy'}) echo $callback . '(' . $json . ')';

01-通过 第3行代码 可以获取 我们约定的 服务器返回的 调用客户端js函数的函数名(具体可以看上面的链接)

02-第14行输出的 是一个 类似  test({'name' : 'lucy'}) 的字符串.

因为jsonp 是通过 script标签的src属性的跨域性实现的 .   相当于通过script标签的src属性请求一个js文件.

这个js文件 的内容 就是  test({'name' : 'lucy'}).

如果此时我们本地定义了一个函数 test() .

那么但我们通过script的src属性请求一个远程的js文件时, 这个js文件的内容是 test({'name':'lucy'}) , 那么就会调用这个本地的test()函数

3. $.post()方法实现

 <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
var param = new Object();
param.year = 2010;
param.name = '李刚'; $.post('json_r01.php?callback=?', param, function(data, textStatus, xhr) {
console.log(data);
console.log(data.newYear);
console.log(data.msg);
},'jsonp'); </script>

结果: 图片01

注意:

01 .使用$.post() ,需要

1) 在url地址后面加上 ?callback=?

这里callback的值是? 是因为 jquery会随机给callback赋值 ; 通常情况下 不需要给callback指定一个值.

从图片01 中可以看出  callback已经有一个随机的值是jQuery19106356678668554155_1470797830605

服务器端 响应的函数 的 函数名也是

     jQuery19106356678668554155_1470797830605({"newYear":2016,"msg":"\u674e\u521a\u6d4b\u8bd5\u4fe1\u606f"})

  

  2) 要求返回的数据格式写上 'jsonp'

02 .使用jquery后 简化了我们的工作

1)不需创建一个访问远程文件的script标签

2)不需要在本地创建一个以callback 的值为 名字的 本地js函数 .

我们直接在 $.post()方法的 回调函数中 就可以使用 返回来的 字符串 test({'name' : 'lucy'}) 中的json数据

--------------

如果我们设置了 callback的值是 test01

 <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
var param = new Object();
param.year = 2010;
param.name = '李刚'; $.post('json_r01.php?callback=test01', param, function(data, textStatus, xhr) {
console.log(data);
console.log(data.newYear);
console.log(data.msg);
},'jsonp'); </script>

结果:图片02

即使我们设置了 callback = test01 . jquery仍然是 用随机的代替了.

所以至少在 $.post()方法中, 给 url中的添加查询字符串 ?callback=? 就可以了.

4. $.getJson()的实现

客户端代码:

 <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
var param = new Object();
param.year = 2010;
param.name = '李刚'; $.getJSON('json_r01.php?callback=?', param, function(data, textStatus, xhr) {
console.log(data);
console.log(data.newYear);
console.log(data.msg);
}); </script>

结果: 图片03

注意:使用 $.getJSON()方法

01 . 只需要在 url地址后面加上一个请求字符串 ?callback=? 就可以了.

02 .从图片03中可以看出 返回的函数名也是随机生成的 .

03 .$.getJSON()是通过get的方式传值, 可以看到name 和 year 也是以请求字符串的形式 附在 url地址尾部.

-----------------

如果我们给 callback设置一个具体的值 . 如 callback=test01

 <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
var param = new Object();
param.year = 2010;
param.name = '李刚'; $.getJSON('json_r01.php?callback=test01', param, function(data, textStatus, xhr) {
console.log(data);
console.log(data.newYear);
console.log(data.msg);
}); </script>

结果:图片04

注意:

01:此时classback = test01 . 被传递到服务器端,  服务器端 返回的函数名也是 test01()

02: 但是 $.getJSON()的回调函数无法识别. 在回调函数中无法说使用 data.msg输出信息.

--------------------------------------------

总结:

在$.getJSON()中只需要在 url中加上一个请求字符串 ?callback = ? 就可以了. 且 callback的值只能是?

5. $.ajax()方法实现

前台代码:

 <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
var param = new Object();
param.year = 2010;
param.name = '李刚'; $.ajax({
url: 'json_r01.php',
type: 'POST',
dataType: 'jsonp',
data: param,
jsonp: 'callback',
success: function(data){
console.log(data);
console.log(data.newYear);
console.log(data.msg);
}
}) </script>

结果:图片05

注意:

01 --url中不需要设置请求字符串

02--dataType: 'jsonp',

03--jsonp: 'callback'

04--不需要设置callback的值, jquery自动有了一个随机的值.

-----------------------------------------------------

自己设置callback的值

 <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
var param = new Object();
param.year = 2010;
param.name = '李刚'; $.ajax({
url: 'json_r01.php',
type: 'POST',
dataType: 'jsonp',
data: param,
jsonp: 'callback',
jsonpCallback:'test01',
success: function(data){
console.log(data);
console.log(data.newYear);
console.log(data.msg);
}
}) </script>

结果:图片06

注意:

01-这里只是多设置了一个jsonpCallback:'test01',

此时图片06中的 返回的函数名是 test01()

6. 最新的测试用例模拟:

请求端:

---------

接收端:

--------------

可见请求端 和 接收端 是跨域的.

6-1: 一般的ajax请求: 因为跨域,无法访问.

因为ajax无法跨域请求.

----------

noJsonp.php :请求端:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> </title>
<script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
var param = new Object();
param.year = 2010;
param.name = '李刚'; $.ajax({
url: 'http://www.a.com/nojson_return.php',
type: 'POST',
dataType: 'json',
data: param,
success: function(data){
console.log(data);
console.log(data.newYear);
console.log(data.msg);
}
}) </script>
</head>
<body> </body>
</html>

-------------

接收端: nojson_return.php

 <?php

 $arr = array();
$arr['newYear'] = $_REQUEST['year'] + 6;
$arr['msg'] = $_REQUEST['name'] . '测试信息'; //json编码
$json = json_encode($arr); echo $json; ?>

-----------

访问的结果:

跨域没有数据.

可见,ajax 无法跨域访问数据.

但是. http访问 是可以的.

例如:

---

6-2:通过jsonp , ajax获取数据.

----

请求端: jsonp.php

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> </title>
<script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
var param = new Object();
param.year = 2010;
param.name = '李刚'; $.ajax({
url: 'http://www.a.com/jsonp_return.php',
type: 'POST',
dataType: 'jsonp',
data: param,
jsonp: 'callback',
success: function(data){
console.log(data);
console.log(data.newYear);
console.log(data.msg);
}
}) </script>
</head>
<body> </body>
</html>

-----------

接收端: jsonp_return.php

 <?php

 $callback = $_REQUEST['callback'];

 $arr = array();
$arr['newYear'] = $_REQUEST['year'] + 6;
$arr['msg'] = $_REQUEST['name'] . '测试信息'; //json编码
$json = json_encode($arr); //返回一个调用函数的字符串: 例如 test({'name': 'lucy'}) echo $callback . '(' . $json . ')'; ?>

---------------

访问结果:

jquery中使用jsonp的更多相关文章

  1. jQuery中利用JSONP解决AJAX跨域问题

    写在前面 跨域的解决方案有多种,其中最常见的是使用同一服务器下的代理来获取远端数据,再通过ajax进行读取,而在这期间经过了两次请求过程,使得获取数据的效率大大降低,这篇文章蓝飞就为大家介绍一下解决跨 ...

  2. jQuery中通过JSONP来跨域获取数据的三种方式

    第一种方法是在ajax函数中设置dataType为'jsonp' $.ajax({ dataType: 'jsonp', url: 'http://www.a.com/user?id=123', su ...

  3. jquery中的jsonp跨域调用

                                                    jquery jsonp跨域调用接口

  4. jquery中的jsonp跨域调用(接口)

                                                                           jquery jsonp跨域调用接口

  5. jquery中的jsonp和js中的jsonp还有配合php实现的jsonp。

    最近在做一个自己的网站,才知道一个前端需要学习的东西到底有多少. 来吧~步入正题,我的网站空间很小.所以在资源上,就有点吼不住了.跨域拿数据肯定是不可避免的了. 一.原生js: 我们知道他的原理,就是 ...

  6. JSONP原理及jQuery中的使用

    JSONP原理   JSON和JSONP   JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于在浏览器和服务器之间交换信息.   JSONP(JSON ...

  7. jquery 中jsonp的实现原理

    在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,即一般的 ajax是不能进行跨域请求的.但 img.iframe .script等标签是个例外,这些标签可以通过 src属性请求到其 ...

  8. jQuery中jsonp函数实现

    由于浏览器中的同源策略,不同的域名,不同的协议,甚至不同的端口都无法请求数据.因此出现了浏览器跨域请求数据问题. Jsonp是解决跨域问题的一个非常流行的方法. JSONP(JSON with Pad ...

  9. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

随机推荐

  1. 2018 Machine Learning

    2018/8/13 线性模型(西瓜书P53~P73) Optimizer https://blog.csdn.net/u012151283/article/details/78154917 2018/ ...

  2. UVa 820 因特网带宽(最大流)

    https://vjudge.net/problem/UVA-820 题意: 给出所有计算机之间的路径和路径容量后求出两个给定结点之间的流通总容量. 思路: 裸的最大流问题.注意有个比较坑的地方,最后 ...

  3. [ios][swift]swift中如果做基本类型的转换

    在swift中如果做基本类型的转换的?比如Int -> Float(Double)Double -> 保留两位小数String -> IntDouble -> String 有 ...

  4. 《F4+2—团队项目设计完善&编码测试》

    1:根据OOD详细设计工作要点,修改完善团队项目系统设计说明书和详细设计说明       a.软件系统设计说明书的完善 将测试启动准则,测试结束准则,测试暂停/中止标准加到了测试计划中.将把在测试中会 ...

  5. Qt与FFmpeg联合开发指南(四)——编码(2):完善功能和基础封装

    上一章我用一个demo函数演示了基于Qt的音视频采集到编码的完整流程,最后经过测试我们也发现了代码中存在的问题.本章我们就先处理几个遗留问题,再对代码进行完善,最后把编码功能做基础封装. 一.遗留问题 ...

  6. RabbitMQ入门_13_消息持久化

    参考资料:https://www.rabbitmq.com/tutorials/tutorial-two-java.html 默认情况下,队列中的消息是不持久化的.如果 RabbitMQ 崩溃,队列中 ...

  7. Java JDK5新特性-增强for

    2017-10-31 00:02:16 格式: for(元素数据类型 变量:数组或者Collection集合) { 使用变量即可,该变量即是元素 } int arr[] = {1,2,3,4,5}; ...

  8. C#异常信息获取

    try { ; / i; } catch (Exception ex) { /** * 1.异常消息 * 2.异常模块名称 * 3.异常方法名称 * 4.异常行号 */ String str = &q ...

  9. rsync+inotify文件同步 - 同步慢的问题

    rsync+inotify文件同步 - 同步慢的问题 我们来看网上的教程,我加了注释.(网上所有的教程基本都一模一样,尽管写法不一样,致命点都是一样的) #!/bin/bash /usr/bin/in ...

  10. 20161212xlVBA工作表数据整理合并单元格

    Sub NextSeven_CodeFrame() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAlerts = Fal ...