ajax就是这么简单

Posted Ado的日记本

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ajax就是这么简单相关的知识,希望对你有一定的参考价值。


如何发请求?

用 form 可以发请求,但是会刷新页面或新开页面
用 a 可以发 get 请求,但是也会刷新页面或新开页面
用 img 可以发 get 请求,但是只能以图片的形式展示
用 link 可以发 get 请求,但是只能以 CSS、favicon 的形式展示
用 script 可以发 get 请求,但是只能以脚本的形式运行

有没有什么方式可以实现:
get、post、put、delete 请求都行
想以什么形式展示就以什么形式展示

微软的突破

IE 5 率先在 JS 中引入 ActiveX 对象(API),使得 JS 可以直接发起 HTTP 请求。
随后 Mozilla、 Safari、 Opera 也跟进(抄袭)了,取名 XMLHttpRequest,并被纳入 W3C 规范

AJAX

基本概念:
AJAX = Asynchronous JavaScript and XML(异步的 javascript 和 XML)。
Ajax主要是客户端与服务器交换数据的一种技术,它有2个主要功能:
向服务器发出请求,而不重新加载页面
接受和处理服务器返回的数据

如何发送HTTP请求?

第一步:需要创建一个XMLHttpRequest 对象,它是浏览器和服务器之间数据交换的桥梁。
语法: var request=new XMLHttpRequest();

第二步:使用 XMLHttpRequest 对象的 open() 和 send() 方法将请求发送到服务器。
XMLHttpRequest.open("GET","test1.txt",true);
XMLHttpRequest.send();

两个方法:
open(method,url,async),规定请求的类型、URL 以及是否异步处理请求。
method:请求的类型;GET 或 POST
url:文件在服务器上的位置
async:true(异步)或 false(同步)

send(string),将请求发送到服务器。

GET 还是 POST?

与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用 POST 请求:
无法使用缓存文件(更新服务器上的文件或数据库) 
向服务器发送大量数据(POST 没有数据量限制) 
发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

服务器响应

如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。
responseText:获得字符串形式的响应数据。
responseXML:获得 XML 形式的响应数据。

处理服务器响应

在处理服务器返回的数据之前,我们首先要知道服务器处理请求的状态(是已经返回数据还是处理出错了)。
XMLHttpRequest 对象的readyState属性,就是用来标识当前XMLHttpRequest对象处于什么状态的。它有5个状态,如下:

状态 描述
0 UNSENT 未初始化状态:此时,已经创建了一个XMLHttpRequest对象
1 OPENED 准备发送状态:此时,已经调用了XMLHttpRequest对象的open方法,并且XMLHttpRequest对象已经准备好将一个请求发送到服务器端
2 HEADERS_RECEIVED 已经发送状态:此时,已经通过send方法把一个请求发送到服务器端,但是还没有收到一个响应
3 LOADING 正在接收状态:此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收到
4 DONE 完成响应状态:此时,已经完成了HTTP响应的接收
if (httpRequest.readyState === 4) {
 // 一切都很好,收到回复
} else {
 // 还没准备好
}

接下来我们就要根据服务器不同的响应执行不同的任务。每当 readyState 改变时,会触发 onreadystatechange 事件。onreadystatechange事件存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
最后,我们还要检查HTTP服务器响应的响应代码,status表示响应的HTTP状态码,它也是XMLHttpRequest对象的一个属性。
status的状态码可以在网上找到,如200表示请求成功.

状态码 响应类别 原因短语
1XX 信息性状态码(Informational) 服务器正在处理请求
2XX 成功状态码(Success) 请求已正常处理完毕
3XX 重定向状态码(Redirection) 需要进行额外操作以完成请求
4XX 客户端错误状态码(Client Error) 客户端原因导致服务器无法处理请求
5XX 服务器错误状态码(Server Error) 服务器原因导致处理请求出错
if (httpRequest.status === 200) {
 // 完美!
} else {
 // 有一个问题的请求
 //例如响应可能包含404(找不到)
 //或500(内部服务器错误)响应代码
}

现在,在检查请求的状态和响应的HTTP状态代码后,您可以根据需要对服务器发送给您的数据进行任何操作
在 onreadystatechange 事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。

XMLHttpRequest.onreadystatechange=function() {
 if (httpRequest.readyState === 4 && httpRequest.status === 200)
{
   // 要执行的任务
 }

如何使用 XMLHttpRequest ? 代码:
myButton.addEventListener('click', (e)=>{
 let request = new XMLHttpRequest()
 request.open('get', '/xxx') // 配置request
 request.send()
 request.onreadystatechange = ()=>{
   if(request.readyState === 4){
     console.log('请求响应都完毕了')
     console.log(request.status)
     if(request.status >= 200 && request.status < 300){
       console.log('说明请求成功')
       console.log(typeof request.responseText)
       console.log(request.responseText)
       let string = request.responseText
       // 把符合 JSON 语法的字符串
       // 转换成 JS 对应的值
       let object = window.JSON.parse(string)
       // JSON.parse 是浏览器提供的
       console.log(typeof object)
       console.log(object)
       console.log('object.note')
       console.log(object.note)

     }else if(request.status >= 400){
       console.log('说明请求失败')
     }

   }
 }
})
// 后端代码
 }else if(path==='/xxx'){
   response.statusCode = 200
   response.setHeader('Content-Type', 'text/json;charset=utf-8')
   response.setHeader('Access-Control-Allow-Origin', 'http://frank.com:8001')
   response.write(`
   {
     "note":{
       "to": "小谷",
       "from": "方方",
       "heading": "打招呼",
       "content": "hi"
     }
   }
   `
)
   response.end()

jQuery将这些封装好写成函数 $.ajax() 大大简化了ajax的使用, 并且提高了兼容性,

使用实例:
function drugRecover(drugId) {
           var recoverUrl= "${ctx.contextPath}/drug/drugRecover";
           $.ajax({
               type: 'POST',
               url: recoverUrl,
               dataType: 'json',
               data: {
                   drugId: drugId
               }
           }).done(function (res) {
               //console.log(res);
               // 重新获取页面数据
               var curPageNo = tblContent.find('ul.pagination li.active').attr("yy_page");
               getData(curPageNo);
               //item.prop("disabled", false);
               $('#yy_Modal').modal('hide');

           }).fail(function () {
               alert("fail");
           }); // end ajax
       }

ajax就是这样了~~~


以上是关于ajax就是这么简单的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 3.2 Thymeleaf Ajax 片段

html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。

AJAX相关JS代码片段和部分浏览器模型

你真的了解Ajax吗?

冒泡排序算法原理和代码实现,就是这么简单。。。

Javascript代码片段在drupal中不起作用