热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析Ajax的工作机制及其在现代Web开发中的应用

本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。

一、什么是ajax

ajax是一种异步通信技术。在ajax出现之前,客户端与服务端之间直接通信。引入ajax之后,客户端与服务端加了一个第三者--ajax。有了ajax之后,通过在后台与服务器进行少量数据交换,可以达到在不刷新整个页面的情况下实现局部刷新。其原理如图

二、XHR对象

ajax技术的核心是XMLHttpRequest对象(简称XHR)。IE7+、FireFox、Opera、Chrome和Safari都支持原生的XHR对象,创建XHR对象可以这样写

var xhr = new XMLHttpRequest();

那如果要兼容IE6、7又该怎么写

var xhr = new ActiveXObject("MSXML2,XMLHTTP");

因此兼容写法如下

var xhr = \'\';
window.ActiveXObject ? xhr = new ActiveXObject(\'MSXML2,XMLHTTP\') : xhr = new XMLHttpRequest();

三、XHR用法

创建完XHR对象后,要调用open()方法创建请求,open()方法接受三个参数:

1.要发送的请求的类型(如"get"、"post"等)

2.请求的URL

3.表示是否异步发送请求的布尔值(默认为true,表示异步)

xhr.open("get","index.php",true);

post()请求方法如下面代码

xhr.open("get","index.php",true);
//post()方法必须在send()方法之前加上下面这段代码
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

说明一点:URL相对于执行代码的当前页面,也可以用绝对路径

准备工作做好后,调用send()方法发送请求,

xhr.send(null);

这里get方法传输的数据已经放到url中,可以将参数设置为null

在调用send()方法后,请求就会被分派到服务器,onreadychange捕获请求的状态码,并进行检测

onreadychange对象有个readyState属性,该属性的值表示当前的活动阶段,其值有如下几个:

0:未初始化。尚未调用open()方法

1:启动。已经调用open()方法,但尚未调用send()方法

2:发送。已经调用send()方法,但尚未接收到响应

3:接收。已经接受到部分响应数据

4:完成。已经接受到全部响应数据,并且可以在客户端使用

我们只需判断readyState的值是否为4就可以知道所有数据已经就绪。

 1 xhr.Onreadystatechange= function(){
 2     if (xhr.readyState==4) {
 3         //判断状态码是否成功
 4         if (xhr.status>=200&&xhr.status<=207||xhr.status==304) {
 5             //调用ajax的responseText属性返回数据
 6             alert(xhr.responseText);
 7         }else{
 8             alert(xhr.status);
 9     }  
10 }      

四、总结

原生ajax的请求总结为一下六个步骤

1.创建XHR对象

2.调用open()方法创建请求

3.调用send()方法发送请求

4.onreadychange捕获请求的状态码

5.判断状态吗是否成功

6.调用ajax的responseText属性返回数据

 1 //拼接路径
 2 function toUrl(url, data) {
 3     //获取时间戳
 4     var time = new Date().getTime();
 5     data.time = time;
 6     var arr = [];
 7     for(var i in data) {
 8         var str = i + "=" + data[i];
 9         //["user"=\'lili\',"pass"="4564522",time="145486456"]
10         arr.push(str);
11     }
12     var str = arr.join("&"); //"user=lili&pass=4564522&time=145486456"
13     var path = url + "?" + str;
14     return path;
15 }
16 function fnAjax(obj) {
17     var data = obj.data||{};//可选,如果没有data就新建一个
18     var path = toUrl(obj.url,data);
19     var sendType = obj.sendType||"get";
20     var succFn = obj.succFn||false;
21     var failFn = obj.failFn||false;
22     //1、创建一个XMLHttpRequest对象
23     //兼容写法
24     if(window.ActiveXObject) {
25         var ajax = new ActiveXObject("MSXML2,XMLHTTP");//兼容IE6、7
26     } else {
27         var ajax = new XMLHttpRequest();//现代浏览器
28     }
29     //2、创建一个请求
30     var time = new Date().getTime();
31     //判断传送的类型
32     if (sendType=="get") {
33         ajax.open("get", path);
34         ajax.send(path);
35     }else{
36         var pathArr = path.split("?");
37         ajax.open("post", pathArr[0]);// pathArr[0]?之前的内容
38         //url = "test.txt?time=12365478"
39         //3、发送请求
40         //get方法传输的数据已经放到url中,可以将参数设置为null
41         ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
42         ajax.send(pathArr[1]);//pathArr[1]?之后的内容
43     }
44     //4、检测请求的状态
45     ajax.Onreadystatechange= function() {
46         //如果ajax对象的准备状态发生改变执行事件
47         //onreadystatechange事件是在readyState属性发生改变时触发的,
48         //readyState的值表示当前请求的状态,在事件处理程序中可以根据这个值来进行不同的处理。
49         //5、判断请求的状态
50         if(ajax.readyState == 4) {
51             //6、判断请求结果
52             if(ajax.status >= 200 && ajax.status <= 207 || ajax.status == 304) {
53                 //7、请求成功拿到返回的结果
54                 if (succFn) {
55                     succFn(ajax.responseText);
56                 }
57             } else {
58                 if (failFn) {
59                     failFn(ajax.status);
60                 }                
61             }
62         }
63     }
64 }
View Code

 


推荐阅读
  • 探讨GET与POST请求数据传输的最大容量
    在Web开发领域,GET和POST是最常见的两种数据传输方法。本文将深入探讨这两种请求方式在不同环境下的数据传输能力及其限制。 ... [详细]
  • 本文探讨了如何通过WebBrowser控件在用户点击输入框时自动显示图片验证码。该过程可能涉及JavaScript事件的触发与响应。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • Microsoft即将发布WPF/E的CTP(Community Technology Preview)和SDK,标志着RIA(Rich Internet Application)技术的新里程碑。更多详情及下载链接请参见MSDN官方页面。 ... [详细]
  • 本文介绍了如何利用Selenium和Python通过执行JavaScript代码来控制网页中的滚动条,包括垂直和水平滚动条的控制,以及特定元素的聚焦技术。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 本文探讨了如何为Web浏览器(如Firefox)添加全局热键(例如媒体控制键),并详细说明了实现这一功能所需的步骤,包括可能需要的Firefox扩展和Greasemonkey脚本。 ... [详细]
author-avatar
爱她拿命换
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有