AJAX
Ajax(Asynchronous Javascript And XML 异步传输+js+xml)
Ajax与cookie
- ajax会自动带上同源的cookie,不会带上不同源的cookie
- 可以通过前端设置withCredentials为true, 后端设置Header的方式让ajax自动带上不同源的cookie,但是这个属性对同源请求没有任何影响。会被自动忽略。
withCredentials | MDN
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/', true);
xhr.withCredentials = true;
xhr.send(null);
Ajax请求流程
一、创建XMLHttpRequest对象 let xhr = XMLHTTPRequest()
二、注册设置回调函数
三、使用OPEN方法与服务器建立连接 xmlHttp.open("get","ajax?name="+ name,true) open() 调用open就可以调用xhr对象发送http请求
四、向服务器端发送数据(send() 使用send方法把请求发送到服务器)
xmlHttp.send(null);如果是POST方式就不为空
五、在回调函数中针对不同的响应状态进行处理
- 创建 XMLHttpRequest 对象,也就是创建一个异步调用对象
- 建一个新的 HTTP 请求,并指定该 HTTP 请求的方法、URL 及验证信息
- 设置响应 HTTP 请求状态变化的函数
- 发送 HTTP 请求
- 获取异步调用返回的数据
function ajax(url, handler){
var xhr;
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) {
handler(xhr.responseXML);
}
}
xhr.open('GET', url, true);
xhr.send();
}
ajax/jsonp返回后台数据
ajax和jsonp可以与后台通信,获取数据和信息,但是又不用刷新整个页面,实现页面的局部刷新
异步执行、局部刷新(ajax可以实现局部刷新,只局部刷新,ajax可以自己发送http请求,不用通过浏览器的地址栏,所以页面整体不会刷新,ajax获取到后台数据,更新页面显示数据的部分,页面局部刷新。)
定义:一种发送http请求与后台进行异步通讯的技术。
原理:实例化xmlhttp对象,使用此对象与后台通信。
jsonp
定义:一种可以实现跨域发送http请求的数据通信格式,可以嵌在ajax中使用。
原理:利用script标签可以跨域链接资源的特性。
<script type="text/javascript">
function aa(dat){
alert(dat.name);
}
</script>
<script type="text/javascript" src="....../js/data.js"></script>
用法一:函数传参
将数据以页面定义的函数的参数的形式传递进去,从而获取数据。
本质上可以将数据拆分,使得数据不用强制保存在同一个域名下。
用法二:利用ajax
$.ajax({
url:'...../data.js',//可以不是本地域名
type:'get',
dataType:'jsonp', //jsonp格式访问
jsonpCallback:'aa' //获取数据的函数
})
.done(function(data){
console.log(data.name);
})
.fail(function() {
alert('服务器超时,请重试!');
});
使用ajax的方法本质上也是script标签可以跨域链接资源,不过jquery为其封装了相同的方法,看起来一样。
以上代码的执行过程为:ajax通过jsonp技术跨域访问data.js文件,通过找到aa()方法将其参数传递给.done方法的data参数执行.done方法。
局限性,必须知道data.js文件的名字定义的方法aa,如果在仅仅知道域名的情况下,需要另外的方法.
用法三
var $input = $("input");
$input.keyup(function () {
$.ajax({
url:'https://sug.so.360.cn/suggest?',//请求360搜索的联想数据
type:'get',
dataType:'jsonp', //jsonp格式访问
data: {word: $input.val()},
})
.done(function(data){
console.log(data);
})
.fail(function() {
alert('服务器超时,请重试!');
});
})
....
<body>
<input type="text">
</body>
通过浏览器查看每次输入关键字服务器发送回的数据包,找到js文件中header的地址以及相关的提交数据,发现key为word关键字,因此可以向服务器发送data数据。
服务器返回的数据会自动传给回调的匿名函数的参数data.
ajax的方法:
一、$.ajax({})
1、url 请求地址
2、type 请求方式,默认是'GET',常用的还有'POST'
3、dataType 设置返回的数据格式,常用的是'json'格式,也可以设置为'html'
4、data 设置发送给服务器的数据
5、success 设置请求成功后的回调函数
6、error 设置请求失败后的回调函数
7、async 设置是否异步,默认值是'true',表示异步
$.ajax({
url: 'js/user.json',
type: 'GET',
dataType: 'json',
data:{'aa':1}
})
.done(function(data) {
......
})
.fail(function() {
alert('服务器超时,请重试!');
});
二、$.get():
$.get() 方法使用GET请求从服务器加载数据;也是一种无刷新的请求数据的ajax方法。
参数:
- url:访问的网址,需要遵循同源策略;
- data:发送到服务器的数据。
- function(data,status){}:请求成功运行的函数
- dataType:请求响应的数据类型。
三、$.load():
四、$.post():
五、getJSON()
六、getScript()
如何让一个cookie同时用于a.qq.com和b.qq.com?
不同域名是无法共享浏览器端本地信息,包括cookies,这即是跨域问题
Passport
有一个a.qq.com的图片发到百度贴吧上,会不会带上那个cookie?
ajax请求时是不会自动带上cookie的,要是想让他带上的话,必须设置withCredential为true
ajax会自动带上同源的cookie,不会带上不同源的cookie