Ajax

Ajax: Async JavaScript And XML,异步 JavaScript 和 XML。是浏览器与服务器之间的一种异步通信方式。其实质是使用 XMLHttpRequest 对象异步地向服务器发送请求,服务器返回部分数据,而不是一个完整的页面。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行异步更新。

Ajax 中的异步:可以异步地向服务器发送请求,在等待响应的过程中,不会阻塞当前页面,浏览器可以做自己的事情,直到成功获取响应后,浏览器才开始处理响应数据。

XML:可扩展标记语言,是前后端数据通信时传输数据的一种的格式。
XML 现在已经不怎么用了,比较常用的是 JSON。

优势和不足:

优势:

  1. 不需要安装插件,只要浏览器支持 JavaScript 即可。
  2. 局部刷新页面,用户体验极佳。
  3. 减轻服务器和宽带的负担,按需取数据,减少了冗余请求。

不足:

  1. 不同版本的浏览器对 XMLHttpRequest 对象的支持度不足。
  2. 前进、后退的功能被破环。因为 Ajax 不会跳转提交当前页面,所以永远在当前页面。
  3. 搜索引擎的支持度不够。因为搜索引擎爬虫对静态纯文本 (.html) 理解得很透彻,但对 Ajax 在内部动态地加载更新数据还不能理解。

XMLHttpRequest 对象:

Ajax 的技术核心是 XMLHttpRequest 对象(简称 XHR)。用于客户端和服务端数据的传递和接收。

所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象,老版本的 IE5 和 IE6 使用 ActiveXObject 对象。

创建 XMLHttpRequest 对象:

var xhr = new XMLHttpRequest();

console.log(xhr);
在这里插入图片描述
兼容所有浏览器:

var xhr;
if (window.XMLHttpRequest){
  xhr = new XMLHttpRequest();
 }else{
  xhr = new ActiveXObject("Microsoft.XMLHTTP");
}

XMLHttpRequest 对象的属性:

  1. responseText:响应的文本。
  2. readyState:响应的 readyState 状态码。0 表示未初始化(尚未调用 open() 方法);1 表示启动(已经调用 open() 方法,但尚未调用 send() 方法);2 表示发送(已经调用 send() 方法,但尚未接收到响应);3 表示接收(已经接收到部分响应数据);4 表示完成(已经接收到全部响应数据,而且已经可以在浏览器中使用了)。
  3. status:响应的 HTTP 状态码。
  4. statusText:响应的 HTTP 状态说明。

XMLHttpRequest 对象的方法:

  1. open(type, url, async):启动请求。接收三个参数,分别是请求方法、请求地址、是否异步(true 异步,false 同步);

    open() 方法并不会真正发送请求,而只是做好发送请求前的准备工作。

    xhr.open('GET’, ’demo.php’, true);
    
  2. send(data):发送请求。接收一个字符串参数,作为请求体携带的数据。

    send() 方法不能直接传递对象,可以通过 JSON.stringify() 转换成 JSON 字符串。

    GET 方式不能通过请求体携带数据,所以如果 open() 方法中是 GET 方式,那么 send() 方法中不能传参或者传一个 null。

XMLHttpRequest 对象的事件:

  1. readystatechange():每当 readyState 状态变化时触发。响应的数据会自动填充 XHR 对象的属性。
  2. load():当请求成功完成时触发,此时 readyState 状态为 4。
// 1. 创建 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
// 2. 监听事件、处理响应
xhr.onreadystatechange = () =>{
	if (xhr.readyState !== 4) return;

	if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
		console.log(xhr.responseText)
	}
} 
// 3. 调用 open() 方法启动请求
xhr.open('GET', 'sample.txt', true);
// 4. 调用 send() 方法发送请求
xhr.send();

jQuery 对 Ajax 的封装:

jQuery 中的 Ajax 解决了大部分浏览器的兼容性问题。

jQuery对Ajax的第一层封装:$.ajax()
jQuery对Ajax的第二层封装:$.get()$.post()
jQuery对Ajax的第三层封装:$.getJSON()$.getScript()

$.ajax()是所有jQuery对ajax封装的方法中最底层的方法,所有其他方法都是基于$.ajax()方法的封装。使用$.ajax()方法方法可以代替所有的方法。

$.ajax()方法:

$.ajax({url,type,data,dataType,success,error,async})
参数:

  1. url:请求地址;

  2. type:请求方法;

  3. data:请求参数;

  4. dataType:预期服务器返回的数据类型;

    html:返回的是一个html文档;
    text:返回的是纯文本;
    json:返回的是json字符串;
    xml:返回的是一个xml文档;
    script:返回的是一个javascript脚本;

  5. success(function):请求成功后的回调函数,回调函数有两个参数:data是服务器返回的数据,textStatus是描述状态的字符串;

  6. error(function):请求失败时调用的函数,有三个参数:xhr为底层的XMLHttpRequest对象,textStatus为错误的描述,errorThrown为null。

  7. async:true异步,false同步。

$.ajax({
	url : "/servlet/DemoServlet",
	type : "post",
	data : {
		"name" : $("#name").val()
	},
	dataType : "text",
	success : function(data) {
		alert(data);
	}
});
$.get()方法:

使用get()方式向服务器发送请求。$.get(url,data,callback,dataType)
参数:

  1. url:请求地址;
  2. data:请求参数,有两种形式:字符串形式"name=Lee&age=23",对象形式{‘name’:‘Lee’,‘age’:23};
  3. callback:回调函数,格式是function(data,statusText);
  4. dataType:预期服务器返回的数据类型;
$.get("/servlet/DemoServlet",function(data,statusText) {
		alert(data);
	}
);
$.post()方法:

使用post()方式向服务器发送请求。$.post(url,data,callback,dataType)
参数:

  1. url:请求地址;
  2. data:请求参数;
  3. callback:回调函数,格式是function(data,statusText);
  4. dataType:预期服务器返回的数据类型;
$.post("/servlet/DemoServlet",{‘name’:‘Lee’,‘age’:23},function(data,statusText) {
		alert(data);
	}
);
$.getJSON()方法:

使用get()方式向服务器请求JSON格式的数据。$.getJSON(url,data,callback)

$.getScript()方法:

通过get()方式加载Javascript文件并运行它。$.getScript(url,callback)

该函数用于动态加载JS文件,并在全局作用域下执行文件中的JS代码。
该函数是通过异步方式加载数据。
可以加载跨域的JS文件。

Ajax请求携带token:
$.ajax({
    type: "GET",
    url: "/access/logout/" + userCode,
    headers: {'token': token}
});
$.ajax({
        type: "GET",
        url: "/access/logout/" + userCode,
        beforeSend: function(request) {
            request.setRequestHeader("Authorization", token);
        },
        success: function(result) {
        }
    });

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...