什么是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(协议,约定);
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使用心得,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
问题内容: 我有一个输出html简单行的表格 我可以通过将数据附加到网址(例如http://site.com/form.asp?sample=100)直接访问该过程 因为这是跨域(到子域)的,所以我尝试使用JSONP做到这一点。我首先使用数据类型json进行了尝试,但仍被禁止使用403。这是我正在使用JSONP进行的尝试,但这是种种混乱,并会在错误后面附加此%5Bobject%20Object%5
问题内容: 我想用以下代码用jquery ajax解析JSON数组数据: 我的JSON数据是: 但是我没有任何输出…任何人请帮忙… 问题答案: 概念解释 您是否正在尝试进行跨域AJAX调用?意思是,您的服务不在同一Web应用程序路径中托管吗?您的Web服务必须支持方法注入才能执行JSONP。 您的代码看起来不错,并且如果您的Web服务和Web应用程序托管在同一域中,则该代码应该可以正常工作。 当您
我理解的JSONP的方式就是,通过JS代码,动态创建一个Script标签,通过标签的src的网址里面包含一个JSONP属性,后端接收到后返回一个url中jsonp=参数,这样一个参数(包含一个json),通过执行这个参数命名的函数来实现跨域。 以下是JS中的代码 var util = {}; /*[function 在页面注入脚本]*/ util.createScript = function(u
本文向大家介绍jQuery Jsonp跨域模拟搜索引擎,包括了jQuery Jsonp跨域模拟搜索引擎的使用技巧和注意事项,需要的朋友参考一下 效果还不错 就差加上键盘控制了... 代码如下: 以上所述是小编给大家介绍的jQuery Jsonp跨域模拟搜索引擎的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!
问题内容: 帮助,如果您可以- 情况: http://foobar.com包含一个远程托管的Javacript文件(http://boobar.com/stuff.js)。 目标是从foobar.com上的远程托管php脚本中获取警报 我在stuff.js中尝试了以下代码: 没运气。 也没有运气。 在php端,我尝试了以下两种方法: 在Firefox中,出现安全错误。我了解它认为我违反了安全模型。
本文向大家介绍原生JS封装Ajax插件(同域、jsonp跨域),包括了原生JS封装Ajax插件(同域、jsonp跨域)的使用技巧和注意事项,需要的朋友参考一下 抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习。。。 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的。。。简单说说思路,如有不正确的地方,还望指正^_^ 一、Ajax核