




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JSONP的诞生、原理及应用实例问题:页面中有一个按钮,点击之后会更新网页中的一个盒子的内容。Ajax可以很容易的满足这种无须刷新整个页面就可以实现数据变换的需求。但是,Ajax有一个缺点,就是他不允许跨域请求资源。如果我的代码在codepen上,我不能将我的数据放到codepen网站上,那么我只能放到我自己的服务器中,这样的话,就无法通过Ajax访问到这个数据了。解决:想要实现这种跨域资源请求,有很多解决办法,列举出一部分:让服务器来加载远程数据,然后在用户请求时提供给浏览器。用<script>或是<iframe>标签加载外来文件。(因为他们的src属性允许获得任何地方的资源。)W3C制定的Cross-OriginResourceSharing(CORS,跨域资源共享)。JSONPJSONP的诞生及原理:jsonp的原理其实和第二种解决方法一模一样,只不过他更加方便,然后这种跨域沟通的手段就被赋予了一个名字“JSONP”。所以首先要弄懂第二种方式是怎么工作的:原理:如果一个页面加载了一个外来的JS文件,浏览器就会自动执行这个文件中的代码。所以假如localhost想要使用jsonhost上面的一个JSON数据,localhost就可以让jsonhost来帮他完成这件事情,jsonhost提供给他一个js文件,往要调用的函数中传入需要的数据,结果是和localhost自己调用函数的效果一模一样了。jsonhost:<scripttype="text/javascript">varjson='["customername1","customername2"]';callbackFunction(json);</script>localhost:复制代码<scripttype="text/javascript">varjson='["customername1","customername2"]';callbackFunction(json);</script><scripttype="text/javascript">functioncallbackFunction(result){varhtml='<ul>';for(vari=0;i<result.length;i++){html+='<li>'+result[i]+'</li>';}html+='</ul>';document.getElementById('divCustomers').innerHTML=html;}</script>复制代码这样,localhost就已经可以使用jsonhost中的数据了。然后localhost说,我希望可以在我的用户点击一次按扭时,就执行一遍callbackFunction(json),而不是页面加载后执行一次。于是他就需要动态的创建<script>标签:复制代码functioncallbackFunction(result){varhtml='<ul>';for(vari=0;i<result.length;i++){html+='<li>'+result[i]+'</li>';}html+='</ul>';document.getElementById('divCustomers').innerHTML=html;}$(".btn").click(function(){varscript=document.createElement('script');script.setAttribute('src',"http://jsonhost/json.js");document.getElementsByTagName('header')[0].appendChild(script);});复制代码这样完成之后,效果就和用Ajax异步请求一样了。到这里,故事仿佛就要这样结束了,但是突然有一天,另一个otherhost跑来和jsonhost说,他想要通过jsoncallbackFunction处理json,jsonhost就很为难,于是他们聚在一起,想要找到一个办法,可以不需要全部使用同一个函数名,也可以获取同一个数据。最终他们想到了一个完美的办法——jsonhost用的函数名用一个变量代替,localhost和otherhost请求数据的时候,传入这个变量名,这样就可以各自决定各自使用的函数名了。jsonhost:复制代码<?phpheader('Content-type:application/json');//告诉接收数据的对象此页面输出的是json数据$json='["customername1","customername2"]';echo$_GET['callback']."(".$json.")";?>复制代码localhost:复制代码<scripttype="text/javascript">functiongetJson(url,funName){varscript=document.createElement('script');script.setAttribute('src',url+funName);document.getElementsByTagName('head')[0].appendChild(script);}functioncallbackFunction(result){varhtml='<ul>';for(vari=0;i<result.length;i++){html+='<li>'+result[i]+'</li>';}html+='</ul>';document.getElementById('divCustomers').innerHTML=html;}$(".btn").click(function(){getJson("http://jsonhost/jsonp.php?jsoncallback=","callbackFunction");});</script>复制代码otherhost:复制代码<scripttype="text/javascript">functiongetJson(url,funName){varscript=document.createElement('script');script.setA('src',url+funName);document.getElementsByTagName('head')[0].appendChild(script);}functionjsoncallbackFunction(result){console.log(result);}$(".btn").click(function(){getJson("http://jsonhost/jsonp.php?jsoncallback=","jsoncallbackFunction");});</script>复制代码这样一来,使用什么函数名都是不同host自己的事情,他们互不干扰,jsonhost也不用操心这件事,专心提供数据就可以了。其他host也纷纷前来获取json。于是这种模式被广泛使用,然后这种通信方式就被命名为“JSONP”。如果用jQuery的话,就不用自己命名函数并传递给参数了,因为这个函数名一点也不重要,他只是个代号而已,jQuery会帮我们自动生成一个函数名,然后将得到的数据传给这个函数。jQuery还会帮我们创建script标签,我们只要关心如何处理这个数据就好了。复制代码<scriptsrc="/libs/jquery/1.8.3/jquery.js"></script><script>$.getJSON("http://jsonhost/jsonp.php?jsoncallback=?",function(data){varhtml='<ul>';for(vari=0;i<data.length;i++){html+='<li>'+data[i]+'</li>';}html+='</ul>';$('#divCustomers').html(html);});</script>复制代码jQuery把JSONP封装到Ajax里面,但本质上这两种技术是完全不同的。JSONP的原理是,当前网页动态执行异域返回的js代码,这个代码是个执行请求数据的函数。浏览器执行这个函数,效果和当前域获得数据执行函数是一样的。应用实例:知道了原理之后,迫不及待的想要用一下JSONP来获取数据。这里用PHP来实现。首先,需要有个服务器,如果没有服务器的话,可以使用wampserver软件模拟一个,这个软件还会建立一个集成环境,可以运行PHP文件。点击查看wampserver教程有了自己的服务器和PHP运行环境之后,就可以开始了。想要在codepen上获取本地数据。本机PHP:复制代码<?phpheader('Content-type:application/json');//告诉接收数据的对象此页面输出的是json数据$quotes='[{"quote":"Ifyoucan\'tgetridoftheskeletoninyourcloset,you\'dbestteachittodance.","author":"GeorgeBernardShaw"},{"quote":"We\'llalwayshaveParis.","author":"Casablanca"},{"quote":"Amathematicianisadeviceforturningcoffeeintotheorems.","author":"PaulErdos"},{"quote":"Do,ordonot.Thereisno\'try\'.","author":"StarWars:EmpireStrikesBack"},{"quote":"Somecausehappinesswherevertheygo;others,whenevertheygo.","author":"OscarWilde"},{"quote":"Problemsworthyofattackprovetheirworthbyfightingback.","author":"PaulErdos"},{"quote":"Maybethisworldisanotherplanet\'sHell.","author":"AldousHuxley"}]';echo$_GET['callback']."(".$quotes.")";?>复制代码codepen上的js:复制代码functionupdate(){varindex=Math.floor(Math.random()*11);$.getJSON("http://localhost/quotes.php?callback=?",function(data){varnum=Math.floor(Math.random()*6);$(".wrap").fadeOut(600,function(){$(".quo").html(data[num].quote);$(".auth").html(data[num].author);$("body,.quot
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 同城相亲合同协议版
- 废品管子出售合同协议
- 工程转包安全合同协议
- 专家合作协议合同
- 布置临时房屋合同协议
- 废旧轮胎转移合同协议
- 合同改签第三方协议
- 4s店车购车协议合同
- 上学租房合同协议
- 三间建房合同协议模板
- 安保人员安全培训课件
- 2025年中国光伏电池市场发展现状调研及投资趋势前景分析报告
- 2025年元宇宙+游戏行业新兴热点、发展方向、市场空间调研报告
- 问题等于机会的培训
- 人教版 七年级英语下册 第二学期 期中综合测试卷(2025年春)
- 《疥疮的防治及治疗》课件
- 建筑施工大型机械设备安全使用与管理培训
- 技术转让合同备忘录协议备忘录(2024年版)
- 注册会计师财务成本管理章节练习题三
- 第十一单元课题1化学与人体健康-2024-2025学年九年级化学人教版(2024)下册
- 《子宫内膜异位》课件
评论
0/150
提交评论