用原生js来处理跨域的数据(jsonp)
说明总结:
1.ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本。
2.但是ajax和jsonp在数据传输的过程中都是可以用json格式的数据。
3.其实ajax与jsonp的区别不在于是否跨域,ajax通过服务端代理一样可以实现跨域,jsonp本身也不排斥同域的数据的获取。
4.ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装;
服务器端代码:
1 //获取客户端的信息 2 if (isset($_GET['code'])) { 3 if ($_GET['code'] == "CA1998") { 4 $flightId = $_GET['code']; 5 $price = 1000; 6 } 7 else if ($_GET['code'] == "CA1997") { 8 $flightId = $_GET['code']; 9 $price = 2000; 10 } 11 else{ 12 $flightId = 0; 13 $price = 0; 14 } 15 $flightHandler = array('flightId'=>$flightId,'price'=>$price); 16 $flightHandler = json_encode($flightHandler); 17 $flightHandler = "flightHandler(".$flightHandler .");";// 将数据进行了包装,包装成了一个调用的函数,这一步很重要。 18 print_r($flightHandler); 19 }
获取到的服务器数据:
1 flightHandler({ 2 "flightId": "CA1998", 3 "price": 2000 4 });
5 //其实就在服务器端把json数据包装成了一个js的函数,将一个对象作为参数放在函数里面。所以跟ajax用XMLHttpRequest接收数据是不一样的。
传统ajax获取到的json数据:
1 { 2 "flightId": "CA1998", 3 "price": 2000 4 }
客户端代码:
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>XHR</title> 6 <link rel="stylesheet" href="../templates/css/verify.css"> 7 </head> 8 <body> 9 <label for="flightId">输入:CA1998 或者 CA1997 </label> <input type="text" id="flightId" name="flightId"> <input type="button" value="原生js获取jsonp数据(php包装数据)" onclick="flightHandler0()"><input type="button" value="原生js获取jsonp数据(js包装数据)" onclick="flightHandler1()"> 10 <script type="text/javascript"> 11 12 // 得到航班信息查询结果后的回调函数 13 function flightHandler(data){ 14 if (data.price != 0) { 15 alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '航班 ' + data.flightId ); 16 } else{ 17 alert("EORROR"); 18 }; 19 20 }; 21 22 function flightHandler0(){ 23 var flightId = document.getElementById('flightId').value; 24 //供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码) 25 //其实参数都是前端和后台程序员规定的,前端传过去,后端判断获取即可。 26 var url = "flightResult.php?code=" + flightId +"&callback=flightHandler"; 27 // 创建script标签,设置其属性 28 var script = document.createElement('script'); 29 script.setAttribute('src', url); 30 // 把script标签加入head,此时调用开始 31 document.getElementsByTagName('head')[0].appendChild(script); 32 }; 33 34 </script> 35 </body> 36 </html>
设想:
上面的方法是在服务器端把json数据包装在回调函数里面,那能不能在客户端来做这个事情呢?但是试了一下感觉行不通。
在服务器端把
$flightHandler = "flightHandler(".$flightHandler .");";
去掉。
留言中有用jquery写的jsonp的例子。
最后附上用原生js和jquery分别处理jsonp的例子:
js:http://snowinmay.net/ajax/xhr-js-jsonp.html
jsonp:http://snowinmay.net/ajax/xhr-jquery-jsonp.html
所以返回数据应该是json数据,但是在客户端好像没有很好的办法来包装这个数据。如果有的话以后再补充。
学透前端行业所有技术,玩遍北京周边所有城市。然后我会回到那个生我养我的地方,因为有亲人的地方才是家。