异步 JavaScript 和 XML( AJAX )是一种与服务器交换数据并更新网页的某些部分的技术,而无需重新加载整个网页。 换句话说, AJAX 允许通过与幕后服务器交换少量数据来异步更新网页。 如果应用未使用 AJAX,则必须在用户提出的每个请求上重新加载网页。

在本面向初学者的 *ajax 教程中,我将介绍在开发基于 ajax 的应用之前,您应该了解的所有基本和重要事实,以充分利用 ajax 的功能。

1. ajax 如何工作?

重要的是要了解 Ajax 不是单一技术,而是一组技术,例如 HTML,CSS,DOM 和 JavaScript 等。 HTMLCSS 可以组合使用以标记和样式信息。 通过 JavaScript 访问 DOM ,以动态显示所呈现的信息,并允许用户与之交互。 JavaScript 和XMLHttpRequest对象提供了一种在浏览器和服务器之间异步交换数据以避免重新加载整个页面的方法。

近年来,XML 的本质已经减少。 JSON (JavaScript 对象表示法)通常用作数据交换的替代格式,尽管其他格式(例如预格式化的 HTML 或纯文本)也可以用于数据目的。

1.1 Ajax 生命周期

通常,对服务器的 ajax 调用和从服务器获取响应(生命周期事件)涉及以下步骤:

  • 您在浏览器的地址栏中键入网页的 URL,然后按Enter。 页面已加载到浏览器窗口中。
  • 某些操作会触发事件,例如用户单击按钮。
  • 事件触发 ajax 调用,并使用 xml 或 json 向服务器发送请求。
  • 服务器服务从 ajax / http 请求获取输入,并处理该请求。 如果需要,它还会准备响应数据。
  • 服务器将数据发送回发出请求的原始网页。
  • 另一个 JavaScript 函数称为回调函数,该函数接收数据并更新网页。

很容易,对吧? 让我们在下面的图片中查看所有动作。

AJAX 如何工作?

2. Ajax XMLHttpRequest对象

AJAX 的核心是XMLHttpRequest对象(可在客户端脚本语言(如 javascript)中使用)。 XMLHttpRequest对象用于与后台的服务器交换数据。 所有现代浏览器(IE7+,Firefox,Chrome,Safari 和 Opera)都具有内置的XMLHttpRequest对象。

如果您使用的是 IE5 或 IE6(我想知道是否有人仍在使用它),则ActiveXObject将用于服务器通信以发送 Ajax 请求。

2.1 创建XMLHttpRequest对象

这样创建一个XMLHttpRequest的新对象:

 //Creating a new XMLHttpRequest objectvar xmlhttp;if (window.XMLHttpRequest){xmlhttp = new XMLHttpRequest(); //for IE7+, Firefox, Chrome, Opera, Safari}else{xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); //for IE6, IE5}

可以重新使用此xmlhttp变量发送多个 ajax 请求,而无需创建新对象。 出于安全原因,XMLHttpRequest受浏览器的相同来源策略约束。 这意味着只有在向原始网页提供服务的同一服务器上发出请求时,请求才会成功。

3. XMLHttpRequest方法

为了发送请求和设置请求属性,XMLHttpRequest对象具有一些方法。 让我们来看看他们:

3.1 open(method, url, isAsync, userName, password)

必须通过打开方法初始化XMLHttpRequest对象的 HTTP 和 HTTPS 请求。 此方法指定请求的类型(GET,POST 等),URL,以及是否应异步处理请求。 我将在下一部分中介绍第三个参数。

第四个和第五个参数分别是用户名和密码。 如果服务器需要此参数,则可以提供这些参数或仅提供用户名以进行身份​​验证和授权。

例:

 xmlhttp.open("GET","report_data.xml",true);xmlhttp.open("GET","sensitive_data.xml",false);xmlhttp.open("POST","saveData",true,"myUserName","somePassord");

3.2 setRequestHeader(name, value)

成功初始化请求后,可以调用XMLHttpRequest对象的setRequestHeader方法来发送带有请求的 HTTP 标头。

示例:

 //Tells server that this call is made for ajax purposes.xmlhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');  

3.3 send(payload)

要发送 HTTP 请求,必须调用XMLHttpRequestsend方法。 此方法接受单个参数,该参数包含要与请求一起发送的内容。
在 POST 请求中,该内容是必需的。 对于 GET 方法,隐式传递null作为参数。

示例:

 xmlhttp.send(null); //Request with no data in request body; Mostly used in GET requests.xmlhttp.send( {"id":"23423"} ); //Request with data in request body; Mostly used in POST/ PUT requests.

3.4 abort()

如果XMLHttpRequest对象的readyState尚未变为 4 (请求完成),则此方法将中止请求abort方法确保回调方法不会在异步请求中被调用。

语法:

 //Abort the processingxmlhttp.abort();

除上述方法外,onreadystatechange事件监听器非常重要,我们将在下一部分中进行讨论。

4. 同步和异步 ajax 请求

XMLHttpRequest对象能够根据网页中的要求发送同步和异步请求。 该行为由打开方法的第三个参数控制。 对于异步请求,此参数设置为true,对于同步请求,此参数设置为false

 xmlhttp.open("GET", "report_data.xml", true); //Asynchrnonos request as third parameter is truexmlhttp.open("GET", "report_data.xml", false); Synchrnonos request as third parameter is false

如果未提供,则此参数的默认值为“true

异步 Ajax 请求不会阻止网页,并且在服务器上处理请求时,用户可以继续与页面上的其他元素进行交互。 您应该始终使用异步 Ajax 请求,因为同步 Ajax 请求会使 UI(浏览器)无响应。 这意味着在请求完成之前,用户将无法与网页进行交互。

在极少数情况下,应格外小心地使用同步请求。 例如,如果您要使用 ajax 在客户端上嵌入新的 JavaScript 文件,然后再引用该 JavaScript 文件中的类型和/或对象,则应使用同步 Ajax 请求。 然后,应该通过使用同步 Ajax 请求来包括对该新 JS 文件的提取。

4.1 同步 ajax 请求示例

var request = new XMLHttpRequest();
request.open('GET', '/bar/foo.txt', false);  //"false" makes the request synchronous
request.send(null);if(request.status === 200)
{//request successful; handle the response
}
else
{//Request failed; Show error message
}

4.2 异步 Ajax 请求示例

var request = new XMLHttpRequest();
request.open('GET', '/bar/foo.txt', true);  //"true" makes the request asynchronousrequest.onreadystatechange = function() {if (request.readyState == 4) { if (request.status == 200) {//request succeed} else{//request failed}}
};request.send(null)

4.3 onreadystatechange事件

在上面的示例中,onreadystatechange是向XMLHttpRequest请求注册的事件监听器。 onreadystatechange存储一个函数,该函数将处理从服务器返回的响应。 在请求的生命周期中,所有重要事件都将被调用。 每次在请求处理中完成一个步骤时,readyState的值都会更改并设置为其他值。 让我们看一下可能的值:

0:未初始化请求

1:建立服务器连接

2:接收请求

3:处理请求

4:请求已完成,响应已准备就绪

4.4 处理来自服务器的响应

要从服务器获取响应,请使用XMLHttpRequest 对象的responseTextresponseXML属性。 如果来自服务器的响应是 XML,并且您要将其解析为 XML 对象,请使用responseXML属性。 如果来自服务器的响应不是 XML,请使用responseText属性。

responseText:从服务器获取响应作为字符串

responseXML:从服务器获取 XML 响应

示例代码:

if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) {document.getElementById("message").innerHTML = xmlhttp.responseText;} else {alert('Something is wrong !!');}
}

5. Ajax 教程 – 演示

出于演示目的,我创建了一个非常简单的 HelloWorld 应用。 在此应用中,网页发送 ajax GET 请求以查询当前服务器的系统时间。 作为响应,服务器发送当前时间。 很简单。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-llVE3He8-1664257199006)(https://img.kancloud.cn/a6/68/a668cd7339b660a197c78734bf4989ae_560x140.png “ajax demo application”)]

5.1 异步请求示例

为了使网页能够发送此类请求,我在 JSP 页面中编写了以下 javascript 代码:

function ajaxAsyncRequest(reqURL)
{//Creating a new XMLHttpRequest objectvar xmlhttp;if (window.XMLHttpRequest){xmlhttp = new XMLHttpRequest(); //for IE7+, Firefox, Chrome, Opera, Safari} else {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); //for IE6, IE5}//Create a asynchronous GET requestxmlhttp.open("GET", reqURL, true);//When readyState is 4 then get the server outputxmlhttp.onreadystatechange = function() {if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) {document.getElementById("message").innerHTML = xmlhttp.responseText;//alert(xmlhttp.responseText);} else{alert('Something is wrong !!');}}};xmlhttp.send(null);
}

并触发 ajax 请求,应单击一个按钮,其内容为:

 <input type="button" value="Show Server Time" onclick='ajaxAsyncRequest("get-current-time")'/>

为了处理服务器端的请求,我编写了一个像这样的 servlet:

public class GetTimeServlet extends HttpServlet
{private static final long serialVersionUID = 1L;public void doGet (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {response.setHeader("Cache-Control", "no-cache");response.setHeader("Pragma", "no-cache");PrintWriter out = response.getWriter();Date currentTime= new Date();String message = String.format("Currently time is %tr on %tD.",currentTime, currentTime);out.print(message);}
}

上面的代码将以文本形式返回当前服务器时间,以客户端代码的形式接收并打印在网页上。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gmDoyjzC-1664257199006)(https://img.kancloud.cn/17/24/1724167ce8823135c55cd2ce3cecdf0c_610x154.png “ajax demo application success”)]

5.2 同步请求示例

要发送同步 ajax 请求,请使用以下命令更改index.jsp文件中的 javascript 代码:

function ajaxSyncRequest(reqURL)
{//Creating a new XMLHttpRequest objectvar xmlhttp;if (window.XMLHttpRequest){xmlhttp = new XMLHttpRequest(); //for IE7+, Firefox, Chrome, Opera, Safari} else {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); //for IE6, IE5}//Create a asynchronous GET requestxmlhttp.open("GET", reqURL, false);xmlhttp.send(null);//Execution blocked till server send the responseif (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) {document.getElementById("message").innerHTML = xmlhttp.responseText;} else{alert('Something is wrong !!');}}
}

您无需在同步请求中检查就绪状态,因为仅当请求完成时响应才可用。 到此为止,页面将被阻止。

6. 流行的 ajax 库

显而易见,如今,ajax 是使网页具有高度交互性和用户友好性的非常流行的技术。 为了简化与 Ajax 相关组件的开发,当今市场上的开发人员可以使用各种框架。 好消息是它们都可以免费使用。

6.1 jQuery

jQuery 可能在其替代品中很受欢迎。 它拥有自己的开发者社区,该社区也非常活跃。 使用 jquery 发送 ajax 请求的示例代码如下:

//Current request reference; can be used else where
var request;/* attach a submit handler to the form */
$("#buttonId").submit(function(event) {// abort any pending requestif (request) {request.abort();}/* stop form from submitting normally */event.preventDefault();/*clear result div*/$("#result").html('');/* get some values from elements on the page: */var values = $(this).serialize();/* Send the data using post and put the results in a div */request =$.ajax({url: "ajaxRequest",type: "post",data: values,success: function(){$("#result").html('submitted successfully');},error:function(){$("#result").html('there is error while submit');}   });
});

6.2 Prototype

Prototype 是另一个用于相同目的的流行框架。 但是,请注意,已知 Prototype 与某些其他框架不兼容。 使用 Prototype 发送 ajax 请求的示例代码如下所示:

new Ajax.Request('/some_url',{method:'get',onSuccess: function(transport) {var response = transport.responseText || "no response text";},onFailure: function() { alert('Something went wrong...'); }
});

这就是 ajax 教程的全部内容。 将来我会在 ajax 上写更多文章。 您可能想注册您的电子邮件 ID,以获取更新通知。

Ajax 教程源代码下载

源码下载

前端的ajax你知多少?ajax完全指南奉上相关推荐

  1. 前端面试宝典 html css js ajax es6

    面试宝典 一.HTML和CSS 1 1. 你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? 1 2. 每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗? 1 3. ...

  2. 前端工程师的一生之敌ajax

    Ajax的技术与原理 Ajax的简介 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使 ...

  3. Web前端Javascript笔记(8)Ajax前后端交互

    认识Ajax 全名Asynchronous Javascript and XML(异步JavaScript和XML),节省用户操作时间,提高用户体验,减少数据请求,传输获取数据.Ajax相当于前后台数 ...

  4. 前端笔记知识点整合之服务器Ajax(上)服务器PHP数据交互HTTP

    前端笔记知识点整合之服务器&Ajax(上)服务器&PHP&数据交互&HTTP 一.服务器 1.1 什么是服务器,做什么的? 服务器,就是放在机房中的电脑,和我们的电脑的 ...

  5. 前端学习笔记005:数据传输 + AJAX + axios

    本文要学习的东西又多又杂,包含 JSON.XML.HTTP 协议.AJAX 请求.Promise.axios.(大家也可以看到我已经努力把题目缩到最短了(T_T))但这些知识对后面前端框架的学习是很有 ...

  6. ajax通过什么实现,ajax(通过jQuery实现)

    使用jQuery实现ajax相对来说方便一点,看w3cschool有几种实现的方法,我就总结一下自己以后会用到的几种方法 $.ajax方法: $.ajax方法里面有很多个参数可以使用,但我这里就写自己 ...

  7. ajax顺序请求你,ajax请求之返回数据的顺序问题分析

    这篇文章主要介绍了ajax请求之返回数据的顺序问题,结合实例形式分析了ajax请求返回值的排序问题,需要的朋友可以参考下 本文实例分析了ajax请求之返回数据的顺序问题.分享给大家供大家参考,具体如下 ...

  8. 使用ajax发送数组请求,Ajax请求传递数组参数

    var ids = []; var rows=$("#tt").datagrid("getSelections"); for(var i=0; i ids.pu ...

  9. java中使用ajax请求数据格式化,ajax请求服务器返回json数据格式化

    JQuery--实现Ajax应用 实现Ajax应用 1   .load()异步请求数据,通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,调用格式为load(url,[data], ...

最新文章

  1. VMware的网卡设置模式
  2. 五彩进化树与热图更配-ggtree美颜进化树(宏基因组扩增子)
  3. 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)
  4. 【软件构造】(转) 设计模式
  5. Springboot微服务开发教程系列:开发入门
  6. SAP CRM定价决定(Price Determine)的调试入口
  7. C++头文件,预处理详解
  8. 【LeetCode】【HOT】4. 寻找两个正序数组的中位数(二分查找)
  9. android_x86安装时遇到的问题与修改开机分辨率
  10. 十二、文件上传与下载
  11. mysql客户端工具_性能优化-理解 MySQL 体系结构(MySQL分库分表)
  12. Spring容器扩展机制
  13. VS2015 社区版下载
  14. 如何查看IP地址是否被占用
  15. JavaScript全栈开发-工具篇
  16. 24道互联网大厂最爱问智商题汇总|你能答对几道?(附带答案、详解)
  17. android添加adb命令行,Android—adb命令
  18. 强哥说Java--Java接口
  19. 【PBL项目实战】户外智慧农场项目实战系列——5.天气预报API接口对接
  20. 电商产品展示,选360°全景还是3D展示?

热门文章

  1. python矩阵转置_对python矩阵转置transpose的实例讲解
  2. MongoDB数据迁移(mongodump方式)
  3. 使用Microsoft Project以敏捷的方式跟踪你的项目
  4. JS中的DOM操作属性、DOM创建、DOM增加、DOM修改、DOM删除以及DOM获取非行间样式
  5. yolov5实现旋转目标检测
  6. ​6.29黄金原油走势分析操作建议空头强势下跌美盘如何布局
  7. JS判断数据类型的5种方法
  8. 如何让centos7虚拟机联网
  9. Oracle中删除表
  10. java是脚本语言吗_从脚本语言到Java