jquery中使用jsonp
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的更多相关文章
- jQuery中利用JSONP解决AJAX跨域问题
写在前面 跨域的解决方案有多种,其中最常见的是使用同一服务器下的代理来获取远端数据,再通过ajax进行读取,而在这期间经过了两次请求过程,使得获取数据的效率大大降低,这篇文章蓝飞就为大家介绍一下解决跨 ...
- jQuery中通过JSONP来跨域获取数据的三种方式
第一种方法是在ajax函数中设置dataType为'jsonp' $.ajax({ dataType: 'jsonp', url: 'http://www.a.com/user?id=123', su ...
- jquery中的jsonp跨域调用
jquery jsonp跨域调用接口
- jquery中的jsonp跨域调用(接口)
jquery jsonp跨域调用接口
- jquery中的jsonp和js中的jsonp还有配合php实现的jsonp。
最近在做一个自己的网站,才知道一个前端需要学习的东西到底有多少. 来吧~步入正题,我的网站空间很小.所以在资源上,就有点吼不住了.跨域拿数据肯定是不可避免的了. 一.原生js: 我们知道他的原理,就是 ...
- JSONP原理及jQuery中的使用
JSONP原理 JSON和JSONP JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于在浏览器和服务器之间交换信息. JSONP(JSON ...
- jquery 中jsonp的实现原理
在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,即一般的 ajax是不能进行跨域请求的.但 img.iframe .script等标签是个例外,这些标签可以通过 src属性请求到其 ...
- jQuery中jsonp函数实现
由于浏览器中的同源策略,不同的域名,不同的协议,甚至不同的端口都无法请求数据.因此出现了浏览器跨域请求数据问题. Jsonp是解决跨域问题的一个非常流行的方法. JSONP(JSON with Pad ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
随机推荐
- Win10重命名文件夹导致资源管理器卡顿的解决办法
我本机使用的是 Win10 1607,不清楚是因为什么原因导致重命名文件夹时资源管理器会被卡死,找了很长时间终于找到了解决办法,现在我把步骤粘出来以便后续遇到相同问题的朋友能及时解决. 其实操作很简单 ...
- python打包到pypi小结
如果你写了一个python库,想让别人快速使用你的库,最简单的方式就是使用python官方出品的库托管网站pypi了. pypi的全称是Python Package Index,是pyth ...
- shell 无限循环输出时间
#!/bin/bash while(true) do date >> /home/k/a.log sleep done 查看 tail -f /home/k/a.log
- 语言小知识-MySQL数据库引擎
MySQL作为全世界广受欢迎的数据库,被用于很多中小型的项目中,但是你对 MySQL 数据库的存储引擎了解多少呢? 我们将逻辑表中的数据存储到数据库中,数据库又将我们表中的数据存储到物理设备中(如磁盘 ...
- _proto_和prototype区别
推荐一篇阅读:http://cometosay.com/2016/08/31/js-proto.html es中创建对象的方法 (1)对象字面量的方式 (2)new 的方式 (3)ES5中的`Obje ...
- Java JDK5新特性-静态导入
2017-10-31 00:10:50 静态导入格式:import static 包名 ...类名.方法名: 也就说可以直接导入到方法名. 注意: 方法必须是静态的 如果有多个同名的静态方法,容易不知 ...
- (转)不要自称是程序员,我十多年的 IT 职场总结
其他: 我是一名程序员,工作很努力,为什么绩效还总是垫底? 外企,中年失业何去何从? 来公司半年了,也悟出了一些道理. 如果我可以给每个工程教育增加一门课,它不会涉及编译器.门电路或是时间复杂度,而是 ...
- English trip -- VC(情景课)1 C What's your name?(review)
Xu言: 今天,阴差阳错又上了一次 VC 1 C的课,不过这次是小班的形式.这次课的教室叫 toronto [təˈrɒntəʊ] to ron to (多伦多(加拿大城市)) - -0我还 ...
- php--------删除一个路径下的所有文件夹和文件
php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用. 也适合在thinkphp中清理缓存,在thinkphp中 ...
- Confluence 6 管理多目录概述
这里是有关目录顺序如何影响处理流程: 目录中的顺序是被用来如何查找用户和组的顺序. 修改用户和用户组将会仅仅应用到应用程序具有修改权限的第一个目录中. 配置目录载入顺序 你可以修改在 Confluen ...