JS跨域交互(jQuery+php)之jsonp使用心得


Posted in Javascript onJuly 01, 2016

什么是jsonp?

说到jsonp,你可能最先想到JSON;它还真和JSON有关系;

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

JSONP(JSON with Padding),我更倾向于把最后一个字母P理解为 protocol(协议,约定);

JS跨域交互(jQuery+php)之jsonp使用心得

JSON的优点:

1、基于纯文本,跨平台传递极其简单;

2、Javascript原生支持,后台语言几乎全部支持;

3、轻量级数据格式,占用字符数量极少,特别适合互联网传递;

4、可读性较强,虽然比不上XML那么一目了然,但在合理的依次缩进之后还是很容易识别的;

5、容易编写和解析,当然前提是你要知道数据结构;

JSON的缺点当然也有,但在作者看来实在是无关紧要的东西,所以不再单独说明。

有这么一个故事:

A男和B女居住在不同的国家A国和B国,在一次去C国旅行的途中相遇了,双方聊的比较Happy,旅行结束都回国了;但A男总是会想B女,想联系上B女,无奈当时没有留下B女的电话、邮箱、微信、QQ号码这些可以更加即时的联系方式,只是闲聊间知道B女地址,那就只能写信吧去C国也不太现实;于是就写信把自己的各种即时联系方式都写进去了,一封信寄出去了过了一段时间没有回音又写一封,就是没有收到C友的电话等任何回音;对方收到了没有呢,确定是收到了也看了。
这是为什么呢?C女不想搭理他呗(没有按A男指定的方式回调)!

JSONP就是这么一回事,你知道对方的调用地址,告诉对方你的回调函数名称是什么,但对方如果不配合,就是不调用你约定的回调函数名称,你调用多少次也没用,所以JSONP的关键还是要对方配合你才行。

js跨域交互实现原理

HTML <script> 标签,对就是它,世界因它而美好!

你可以使用这个标签加载任何其它可访问到的网站的js文件试试,我就不多说了;

跨域交互一:jQuery.getScript

这个例子比较简单易懂,使用固定的回调函数名称:fncallback

调用端,也可以说是客户端:

我是在本地测试,跑了多个Web服务,本地页面访问地址:http://localhost:88/

网页中的JS代码如下:

<script type="text/javascript" src="jquery-1.10.2.min.js"></script> 
<script type="text/javascript"> 
//定义名称为“fncallback”的回调函数,参数接收JSON对象; 
function fncallback(data){ 
$(document.body).append("<hr />getScript ok!" + data.reqUrl); 
} 
//注册页面加载完成回调函数(匿名) 
$(document).ready(function(){ 
//使用getScript方法调用跨域脚本; 
$.getScript("http://localhost/test2.php"); 

}); 
</script>

效果:在页面尾部增加一条线,以及:getScript ok! ,后面紧跟被调用端返回的它接收到的请求地址:

getScript ok!/test2.php?_=1467261287339

后面为什么会多了个“?_=1467261287339”呢?

这是防止浏览器从缓存去加载这个URL地址的内容的!由jQuery自动添加;

被调用端,也可以说是服务端

服务端后台语言是PHP,通过Nginx代理的,端口为:80,所以访问地址是:http://localhost/test2.php

test2.php 文件的内容:

<?php 
echo "var reqUrl = \"" . $_SERVER["REQUEST_URI"] . "\";"; 
echo "fncallback({\"reqUrl\": reqUrl });";

浏览器访问:

通过浏览器访问,自然没有后面的参数,除非你自己手动加上;

跨域交互二:jQuery.getJSON

调用端:

<script type="text/javascript"> 
//注册页面加载完成回调函数(匿名) 
$(document).ready(function(){ 
//使用getJSON方法调用跨域脚本;注册匿名回调函数 
$.getJSON("http://localhost/test.php?callback=?", function(data){ 
$(document.body).append("<hr />getJSON ok!" + data.reqUrl); 
}); 
}); 
</script>

注意:我在请求的地址中添加了“?callback=?”,这是做什么用的呢?

目的是让jQuery为我自动生成一个回调函数的名称,并将我注册的匿名回调函数映射到这个“自动生成的回调函数名称”上;
有点绕,我们来看看服务端返回的它收到的请求地址就明白了:

getJSON ok!/test.php?callback=jQuery1102031468501139651384_1467262280037&_=1467262280038

看到callback后面跟了参数值了吧,这就是jQuery自动生成的;再看服务端代码;

服务端

<?php 
echo "var reqUrl = \"" . $_SERVER["REQUEST_URI"] . "\";"; 
echo $_GET["callback"] . "({\"reqUrl\": reqUrl });";

通过 $_GET["callback"] 获取客户端传递过来的回调函数名称;看输出:

var reqUrl = "/test.php?callback=jQuery1102019717387174726153_1467262461959&_=1467262461960"; 
jQuery1102019717387174726153_1467262461959({"reqUrl": reqUrl });

跨域交互三:jQuery.ajax

调用端:

<script type="text/javascript"> 
//注册页面加载完成回调函数(匿名) 
$(document).ready(function(){ 
//使用ajax方法调用跨域脚本; 
$.ajax({ 
url:"http://localhost/test.php", 
dataType: 'jsonp', 
success: function(data){ 
$(document.body).append("<hr />ajax ok!" + data.reqUrl); 
} 
}); 
}); 
</script>

注意:在请求的地址中不需要添加“?callback=?”,但我们使用“dataType: 'jsonp',”;

服务端

这个例子的服务端和上个是完全一样的!

使用总结

使用 getScript 的方式,你可以自己定义一个回调函数的名称,让服务端响应的时候使用你指定的回调函数名称;

使用 getJSON 的方式关键在于URL后面添加的“callback=?”;

使用 ajax 的方式关键在于参数中的数据类型设置“dataType: 'jsonp',”;

以上所述是小编给大家介绍的JS跨域交互(jQuery+php)之jsonp使用心得,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript正则表达式中参数g(全局)的作用
Nov 11 Javascript
新鲜出炉的js tips提示效果
Apr 03 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
Apr 27 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
May 09 Javascript
简单谈谈JS数组中的indexOf方法
Oct 13 Javascript
JS实现页面进入和返回定位到具体位置
Dec 08 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
Jan 08 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
Sep 01 Javascript
vue项目每30秒刷新1次接口的实现方法
Dec 04 Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
Jul 03 jQuery
jQuery实现form表单基于ajax无刷新提交方法实例代码
Nov 04 jQuery
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
Jul 01 #Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
Jul 01 #Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
Jul 01 #Javascript
全面了解JavaScript的数据类型转换
Jul 01 #Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
Jul 01 #Javascript
浅谈JavaScript中的分支结构
Jul 01 #Javascript
Bootstrap下拉菜单效果实例代码分享
Jun 30 #Javascript
You might like
PHP通用检测函数集合
2006/11/25 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
pycharm设置注释颜色的方法
2018/05/23 Python
Python for循环中的陷阱详解
2018/07/13 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
手写一个python迭代器过程详解
2019/08/27 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
Java程序员常见面试题
2015/07/16 面试题
建筑设计所实习生自我鉴定
2013/09/25 职场文书
财务工作犯错检讨书
2014/10/07 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
北京爱情故事观后感
2015/06/12 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书