用原生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的一种形式进行了封装;
服务器端代码:
//获取客户端的信息
if (isset($_GET['code'])) {
if ($_GET['code'] == "CA1998") {
$flightId = $_GET['code'];
$price = 1000;
}
else if ($_GET['code'] == "CA1997") {
$flightId = $_GET['code'];
$price = 2000;
}
else{
$flightId = 0;
$price = 0;
}
$flightHandler = array('flightId'=>$flightId,'price'=>$price);
$flightHandler = json_encode($flightHandler);
17 $flightHandler = "flightHandler(".$flightHandler .");";// 将数据进行了包装,包装成了一个调用的函数,这一步很重要。
print_r($flightHandler);
}
获取到的服务器数据:
flightHandler({
"flightId": "CA1998",
"price": 2000
});
5 //其实就在服务器端把json数据包装成了一个js的函数,将一个对象作为参数放在函数里面。所以跟ajax用XMLHttpRequest接收数据是不一样的。
传统ajax获取到的json数据:
{
"flightId": "CA1998",
"price": 2000
}
客户端代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>XHR</title>
<link rel="stylesheet" href="../templates/css/verify.css">
</head>
<body>
<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()">
<script type="text/javascript"> // 得到航班信息查询结果后的回调函数
function flightHandler(data){
if (data.price != 0) {
alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '航班 ' + data.flightId );
} else{
alert("EORROR");
}; }; function flightHandler0(){
var flightId = document.getElementById('flightId').value;
//供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
//其实参数都是前端和后台程序员规定的,前端传过去,后端判断获取即可。
var url = "flightResult.php?code=" + flightId +"&callback=flightHandler";
// 创建script标签,设置其属性
var script = document.createElement('script');
script.setAttribute('src', url);
// 把script标签加入head,此时调用开始
document.getElementsByTagName('head')[0].appendChild(script);
}; </script>
</body>
</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数据,但是在客户端好像没有很好的办法来包装这个数据。如果有的话以后再补充。
用原生js来处理跨域的数据(jsonp)的更多相关文章
- 原生js实现ajax跨域(兼容IE8,IE9)
html设置meta标签兼容360兼容模式和IE怪异模式 <meta http-equiv="X-UA-Compatible" content="IE=9;IE=8 ...
- Js C# 实现跨域访问数据
使用项目一的js调用项目二的数据 1.项目一 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta ...
- Vue.js 2.0 跨域请求数据
Vuejs由1.0更新到了2.0版本.HTTP请求官方也从推荐使用Vue-Resoure变为了 axios .接下来我们来简单地用axios进行一下异步请求.(阅读本文作者默认读者具有使用npm命令的 ...
- JS实现跨域请求数据--jsonp
* { margin: 0; padding: 0; } input { width: 300px; height: 30px; border: 1px solid lightgray; margin ...
- JAVAEE——宜立方商城11:sso登录注册功能实现、通过token获得用户信息、Ajax跨域请求(jsonp)
1. 学习计划 第十一天: 1.sso注册功能实现 2.sso登录功能实现 3.通过token获得用户信息 4.Ajax跨域请求(jsonp) 2. Sso系统工程搭建 需要创建一个sso服务工程,可 ...
- 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)
1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正 ...
- js中各种跨域问题实战小结(一)
什么是跨域?为什么要实现跨域呢? 这是因为JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.也就是说只能访问同一个域中的资源.我觉得这就有必要了解下javascript中的同源策略 ...
- JS跨域请求之JSONP
在项目开发中遇到跨域的问题,一般都是通过JSONP来解决的.但是JSONP到底是个什么东西呢,实现的原理又是什么呢.在项目的空闲时间可以好好的来研究一下了. JSONP的产生 1.众所周知,Ajax请 ...
- js中各种跨域问题实战小结
什么是跨域?为什么要实现跨域呢? 这是因为JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.也就是说只能访问同一个域中的资源.我觉得这就有必要了解下javascript中的同源 ...
随机推荐
- tomcat部署solr4.10
1.创建solrHome mkdir /opt/solrHome 2.拷贝solr基础数据 /example/solr/* /opt/solrHome 将contrib和dist两个目录拷贝到/opt ...
- TCP 之 RST 原因分析
5. 往一个对端已经关闭的套接字上写入数据会收到一个RST信号 1.发送端的 发送缓冲区还有数据,但接收端tcp的接收通道已关闭 2. SYN到达某端口但此端口上没有正在监听的服务器.对于UDP,当一 ...
- 在见证了1000多家公司的兴衰灭亡之后,YC创始合伙人总结了创业公司的6个不死法则(转)
今天,我想先说一下个人消息.在 YC 工作了 11 年之后,我明年想去休假.我希望把精力放在一些项目上,说实话,我有点累了. YC 是这世界上我最喜欢的事情之一,但它也很费精力. 11 年不间断的耗费 ...
- VScode 好用插件集合(一)
VScode 好用插件集合(一) 什么是VScode Visual Studio Code (简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语 ...
- MyBatis 与 Hibernate 到底哪个更快?
前言 由于编程思想与数据库的设计模式不同,生出了一些ORM框架. 核心都是将关系型数据库和数据转成对象型.当前流行的方案有Hibernate与myBatis. 两者各有优劣.竞争激烈,其中一个比较重要 ...
- 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较
我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...
- 复选框批量删除操作-jquery方式
1.首先在页面添加一个批量删除的按钮:<li class="btns"><input id="deleteSubmit" class=&quo ...
- java 动态代理总结
首先:定义一个接口// 只能是一个接口 例: package DongTai; public interface dongtai { public void show(); } 接着:定义一个被代理类 ...
- init: wait for '/dev/block/bootdevice/by-name/cache' timed out and took 5007ms【学习笔记】
平台信息:内核:4.9.112系统:android one平台:qcom sdm439 作者:庄泽彬(欢迎转载,请注明作者) 一.android设备在开机的时候打印了如下的log,由于系统使用了AB分 ...
- LOJ 6485 LJJ学多项式
前言 蒟蒻代码惨遭卡常,根本跑不过 前置芝士--单位根反演 单位根有这样的性质: \[ \frac{1}{n}\sum_{i=0}^{n-1}\omega_{n}^{ki}=\left[n|k\rig ...