再也不学AJAX了!(二)使用AJAX
在上一篇文章中我们知道,AJAX是一系列技术的统称。在本篇中我们将更进一步,详细解释如何使用Ajax技术在项目中获取数据。而为了解释清楚,我们首先要搞清楚我们是从哪里获取数据的,其次我们关注的才是获取数据的具体方式。 一、获取数据我们知道AJAX用来在项目中以阻止页面刷新的方式获取数据,那么数据从哪里来呢?我们又怎么知道如何获取这些数据?答案是我们通常使用API与各式各样的数据库交互。 “API”是“Application Programming Interface”(即:应用程序接口)的缩写,你可以想象一些数据是开放的并且在等待被使用,而我们获取这些数据的方式便是使用API。API通常的形式是一个URL,并提供指定的参数名和参数值用来帮助你定位所要获取的数据。 还记得我们提过AJAX需要服务器端的相应设置吗?我们之后会再来谈这一点。 二、AJAX技术的核心 - XMLHttpRequest对象让我们先把服务器端的设置抛在一边,聚焦AJAX技术的核心环节:
让我们先从剖析 const xhr = new XMLHttpRequest() 该实例的属性,方法有: 方法
属性
另外,浏览器还为该对象提供了一个 至此,关于XMLHttpRequest实例对象的属性方法就全部罗列完毕了,接下来,我们将更进一步的探究如何使用这些方法,属性完成发送AJAX请求的流程。 三、准备AJAX请求要想与服务器交互,我们首先需要回答以下问题:
而XMLHttpRequest实例的 下面是一个 // 该段代码会启动一个针对“example.php”的GET同步请求。 xhr.open("get","example.php",false) 相当于开始做饭前,将工具准备齐备,将菜洗好, 现在,让我们再深入聊聊一些准备工作的细节: (一)GET请求 与 POST请求
GET请求用于获取数据,有时候我们需要获取的数据需要通过“查询参数”进行定位,在这种情况下,我们会将查询参数追加到URL的末尾,令服务器解析。 查询参数是指一个由 const query = "example.php?name=tom&age=24" // "?name=tom&age=24"即是一个查询参数 需要注意的是,查询字符串中每个参数的名和值都必须使用encodeURIComponent()进行编码(这是因为URL中有些字符会引起歧义,例如“&”)。
POST请求用于向服务器发送应该被保存的数据,因此POST请求天然比GET请求多需要一份需要被保存的数据。那么这些数据应该放在何处呢?毕竟,我们的 答案是需要发送的数据会作为 这里需要注意以下两点:
但好在我们可以通过POST请求模拟表单提交,只需要简单两步:
(二)请求URL地址这里需要注意若使用相对路径,请求URL是相对于执行代码的当前页面。 (三)同步请求与异步请求人们通常认为AJAX是异步的,实际上并非如此,AJAX是避免页面在获取数据后刷新的一种技术,至于等待服务器响应的方式是同步还是异步,需要开发人员结合业务需求进行配置(虽然通常是异步的)。 你可能会好奇,什么时候我们需要使用同步的AJAX?就我个人经验而言,似乎很难找到相应的场景。Stack Overflow上有一个类似的问题,有兴趣的不妨点击查看。 最后我们再简单解释一下“同步”等待响应与“异步”等待响应的区别:“同步”意味着一旦请求发出,任何后续的JavaScript代码不会再执行,“异步”则是当请求发出后,后续的JavaScript代码会继续执行,当请求成功后,会调用相应的回调函数。 四、设置请求头每个HTTP请求和响应都会带有相应的头部信息,包含一些与数据,收发者网络环境与状态等相关信息。XMLHttpRequest对象提供的 默认情况下,当发送AJAX请求时,会附带以下头部信息:
注意,部分浏览器不允许使用 // 自定义请求头 xhr.setRequestHeader("myHeader","MyValue") 五、发送请求到此为止,我们已经完全做好了发送请求的所有准备:利用 // 发送AJAX请求! const xhr = new XMLHttpRequest() xhr.open("get",false) xhr.setRequestHeader("myHeader","goodHeader") xhr.send(null) 呃,简单的有些令人尴尬不是吗?换个POST请求试试看: // 发送AJAX请求! const xhr = new XMLHttpRequest() xhr.open("post","bestHeader") xhr.send(some_data) 额..,总觉得还是差点什么?放轻松伙计,因为我们只是发出了请求,还没有处理响应,我们这就来看看它。 六、处理响应让我们直接看看如何处理一个同步的GET请求响应: const xhr = new XMLHttpRequest() xhr.open("get","goodHeader") xhr.send(null) // 由于是同步的AJAX请求,因此只有当服务器响应后才会继续执行下面的代码 // 因此xhr.status的值一定不为默认值 if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) { alert(xhr.responseText) } else { alert("Request was unsuccessful: " + xhr.status) } 上面的代码不难理解,我们通过之前提到的xhr 如何解决这个问题?答案是通过为XMLHTTPRequest实例添加 xhr实例的
有了这个时间处理程序对AJAX进程做监听,剩下的事就简单多了,一个异步的GET请求代码如下: const xhr = new XMLHttpRequest() xhr.onreadystatechange = () => { if (xhr.readystate == 4) { if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) { alert(xhr.responseText) } else { alert("Request was unsuccessful: " + xhr.status) } } } xhr.open("get",true) xhr.send(null) 注意:为了确保跨浏览器的兼容性,必须要在调用 七、取消异步请求有时候,你可能需要在接收到响应之前取消异步请求,这时候,你需要调用 该方法会令XHR对象实例停止触发事件,并且不再允许访问任何和响应有关的对象属性。没了监控器,我们再也没法判断响应了不是吗? 但是需要注意的是,当终止AJAX请求后,你需要手动对XHR对象实例进行解绑以释放内存空间。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |