AJAX(二)ResponseText、onreadystatechange 事件、readyState、status、ASP和PHP、数据库实例、XML实例

文章目录

  • AJAX(二)ResponseText、onreadystatechange 事件、readyState、status、ASP和PHP、数据库实例、XML实例
    • 1. 服务器响应(responseText)
      • responseText 属性
      • responseXML 属性
    • 2. onreadystatechange 事件(readyState、status)
      • 使用回调函数
    • 3. ASP/PHP 实例
    • 4. 数据库实例
    • 5. XML实例

总结:

  • 如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。
  • 当 readyState 等于 4 且状态为 200 时,表示响应已就绪

回忆:

  • 浏览器与服务器之间,采用 HTTP 协议通信。用户在浏览器地址栏键入一个网址,或者通过网页表单向服务器提交内容,这时浏览器就会向服务器发出 HTTP 请求。

  • 1999年,微软公司发布 IE 浏览器5.0版,第一次引入新功能:允许 JavaScript 脚本向服务器发起 HTTP 请求。这个功能当时并没有引起注意,直到2004年 Gmail 发布和2005年 Google Map 发布,才引起广泛重视。2005年2月,==AJAX 这个词第一次正式提出,它是 Asynchronous JavaScript and XML 的缩写,指的是通过 JavaScript 的异步通信,从服务器获取 XML 文档从中提取数据,再更新当前网页的对应部分,而不用刷新整个网页。后来,AJAX 这个词就成为 JavaScript 脚本发起 HTTP 通信的代名词,也就是说,只要用脚本发起通信,就可以叫做 AJAX 通信。==W3C 也在2006年发布了它的国际标准。

  • 具体来说,AJAX 包括以下几个步骤。

    1. 创建 XMLHttpRequest 实例
    2. 发出 HTTP 请求
    3. 接收服务器传回的数据
    4. 更新网页数据
  • 概括起来,就是一句话,AJAX 通过原生的XMLHttpRequest对象发出 HTTP 请求,得到服务器返回的数据后,再进行处理。现在,服务器返回的都是 JSON 格式的数据,XML 格式已经过时了,但是 AJAX 这个名字已经成了一个通用名词,字面含义已经消失了。

  • XMLHttpRequest对象是 AJAX 的主要接口,用于浏览器与服务器之间的通信。尽管名字里面有XMLHttp,它实际上可以使用多种协议(比如fileftp),发送任何格式的数据(包括字符串和二进制)。

  • 详细流程

    • XMLHttpRequest本身是一个构造函数,可以使用new命令生成实例。它没有任何参数。

      var xhr = new XMLHttpRequest();
      

      一旦新建实例,就可以使用open()方法指定建立 HTTP 连接的一些细节。

      xhr.open('GET', 'http://www.example.com/page.php', true);
      

      上面代码指定使用 GET 方法,跟指定的服务器网址建立连接。第三个参数true,表示请求是异步的。

    • 然后,指定回调函数,监听通信状态(readyState属性)的变化。

    • xhr.onreadystatechange = handleStateChange;function handleStateChange() {// ...
      }
      

      上面代码中,一旦XMLHttpRequest实例的状态发生变化,就会调用监听函数handleStateChange

    • 最后使用send()方法,实际发出请求。

      xhr.send(null);
      

      上面代码中,send()的参数为null,表示发送请求的时候,不带有数据体。如果发送的是 POST 请求,这里就需要指定数据体。

    • 一旦拿到服务器返回的数据,AJAX 不会刷新整个网页,而是只更新网页里面的相关部分,从而不打断用户正在做的事情。

1. 服务器响应(responseText)

如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。

属性 描述
responseText 获得字符串形式的响应数据。
responseXML 获得 XML 形式的响应数据。

responseText 属性

如果来自服务器的响应并非 XML,请使用 responseText 属性。

responseText 属性返回字符串形式的响应,因此您可以这样使用:

document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

responseXML 属性

如果来自服务器的响应是 XML,而且需要作为 XML 对象进行解析,请使用 responseXML 属性:

xmlDoc=xmlhttp.responseXML;
txt="";
x=xmlDoc.getElementsByTagName("ARTIST");
for (i=0;i<x.length;i++)
{txt=txt + x[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("myDiv").innerHTML=txt;

2. onreadystatechange 事件(readyState、status)

当请求被发送到服务器时,我们需要执行一些基于响应的任务。

每当 readyState 改变时,就会触发 onreadystatechange 事件。

readyState 属性存有 XMLHttpRequest 的状态信息。

下面是 XMLHttpRequest 对象的三个重要的属性:

属性:

  • onreadystatechange

    • 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
  • readyState

    • 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。

      • 0: 请求未初始化
      • 1: 服务器连接已建立
      • 2: 请求已接收
      • 3: 请求处理中
      • 4: 请求已完成,且响应已就绪
  • status

    • 200, OK,访问正常
    • 301, Moved Permanently,永久移动
    • 302, Moved temporarily,暂时移动
    • 304, Not Modified,未修改
    • 307, Temporary Redirect,暂时重定向
    • 401, Unauthorized,未授权
    • 403, Forbidden,禁止访问
    • 404, Not Found,未发现指定网址
    • 500, Internal Server Error,服务器发生错误

在 onreadystatechange 事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。

当 readyState 等于 4 且状态为 200 时,表示响应已就绪:

xmlhttp.onreadystatechange=function()
{if (xmlhttp.readyState==4 && xmlhttp.status==200){document.getElementById("myDiv").innerHTML=xmlhttp.responseText;}
}

注意: onreadystatechange 事件被触发 4 次(0 - 4), 分别是: 0-1、1-2、2-3、3-4,对应着 readyState 的每个变化。

使用回调函数

回调函数是一种以参数形式传递给另一个函数的函数。

如果您的网站上存在多个 AJAX 任务,那么您应该为创建 XMLHttpRequest 对象编写一个标准的函数,并为每个 AJAX 任务调用该函数。

该函数调用应该包含 URL 以及发生 onreadystatechange 事件时执行的任务(每次调用可能不尽相同):

function myFunction()
{loadXMLDoc("/try/ajax/ajax_info.txt",function(){if (xmlhttp.readyState==4 && xmlhttp.status==200){document.getElementById("myDiv").innerHTML=xmlhttp.responseText;}});
}

3. ASP/PHP 实例

补充:

  • ASP

    • ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境,可用来创建动态交互式网页并建立强大的web应用程序。当服务器收到对ASP文件的请求时,它会处理包含在用于构建发送给浏览器的HTML(Hyper Text Markup Language,超文本置标语言)网页文件中的服务器端脚本代码。除服务器端脚本代码外,ASP文件也可以包含文本、HTML(包括相关的客户端脚本)和com组件调用
  • PHP
    • PHP(PHP: Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言,吸纳Java和Perl多个语言的特色发展出自己的特色语法,并根据它们的长项持续改进提升自己,例如java的面向对象编程,该语言当初创建的主要目标是让开发人员快速编写出优质的web网站。 [1-2] PHP同时支持面向对象和面向过程的开发,使用上非常灵活。
    • 经过二十多年的发展,随着php-cli相关组件的快速发展和完善,PHP已经可以应用在 TCP/UDP服务、高性能Web、WebSocket服务、物联网、实时通讯、游戏、微服务等非 Web 领域的系统研发。 [21]
    • 根据W3Techs2019年12月6号发布的统计数据,PHP在WEB网站服务器端使用的编程语言所占份额高达78.9% [23] 。在内容管理系统的网站中,有58.7%的网站使用WordPress(PHP开发的CMS系统),这占所有网站的25.0%。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function showHint(str)
{var xmlhttp;//如果输入框为空 **str.length==0**,则该函数清空 **txtHint** 占位符的内容,并退出函数。if (str.length==0){ document.getElementById("txtHint").innerHTML="";return;}if (window.XMLHttpRequest){// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码xmlhttp=new XMLHttpRequest();}else{// IE6, IE5 浏览器执行代码xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}xmlhttp.onreadystatechange=function(){if (xmlhttp.readyState==4 && xmlhttp.status==200){document.getElementById("txtHint").innerHTML=xmlhttp.responseText;}}//请注意我们向 URL 添加了一个参数 q (带有输入框的内容)xmlhttp.open("GET","/try/ajax/gethint.php?q="+str,true);xmlhttp.send();
}
</script>
</head>
<body><h3>在输入框中尝试输入字母 a:</h3>
<form action="">
输入姓名: <input type="text" id="txt1" onkeyup="showHint(this.value)" />
</form>
<p>提示信息: <span id="txtHint"></span></p> </body>
</html>

源代码解析:

如果输入框为空 str.length==0,则该函数清空 txtHint 占位符的内容,并退出函数。

如果输入框不为空,showHint() 函数执行以下任务:

  • 创建 XMLHttpRequest 对象
  • 当服务器响应就绪时执行函数
  • 把请求发送到服务器上的文件
  • 请注意我们向 URL 添加了一个参数 q (带有输入框的内容)

4. 数据库实例

当用户在上面的下拉列表中选择某个客户时,会执行名为 “showCustomer()” 的函数。该函数由 “onchange” 事件触发:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function showCustomer(str)
{var xmlhttp;    if (str==""){如果输入框为空 **str.length==0**,则该函数清空 **txtHint** 占位符的内容,并退出函数。document.getElementById("txtHint").innerHTML="";return;}if (window.XMLHttpRequest){// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码xmlhttp=new XMLHttpRequest();}else{// IE6, IE5 浏览器执行代码xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}xmlhttp.onreadystatechange=function(){if (xmlhttp.readyState==4 && xmlhttp.status==200){document.getElementById("txtHint").innerHTML=xmlhttp.responseText;}}// 请注意我们向 URL 添加了一个参数 q (带有输入框的内容)xmlhttp.open("GET","/try/ajax/getcustomer.php?q="+str,true);xmlhttp.send();
}
</script>
</head>
<body><form action="">
<select name="customers" onchange="showCustomer(this.value)" style="font-family:Verdana, Arial, Helvetica, sans-serif;">
<option value="APPLE">Apple Computer, Inc.</option>
<option value="BAIDU ">BAIDU, Inc</option>
<option value="Canon">Canon USA, Inc.</option>
<option value="Google">Google, Inc.</option>
<option value="Nokia">Nokia Corporation</option>
<option value="SONY">Sony Corporation of America</option>
</select>
</form>
<br>//此处是调用数据库显示的地方
<div id="txtHint">客户信息将显示在这...</div></body>
</html>

showCustomer() 函数执行以下任务:

  • 检查是否已选择某个客户
  • 创建 XMLHttpRequest 对象
  • 当服务器响应就绪时执行所创建的函数
  • 把请求发送到服务器上的文件
  • 请注意我们向 URL 添加了一个参数 q (带有输入域中的内容)

5. XML实例

AJAX 可用来与 XML 文件进行交互式通信。

下面的例子将演示网页如何使用 AJAX 来读取来自 XML 文件的信息:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
table,th,td {border : 1px solid black;border-collapse: collapse;
}
th,td {padding: 5px;
}
</style>
</head>
<body><h1>XMLHttpRequest 对象</h1><button type="button" onclick="loadXMLDoc()">获取我收藏的 CD</button>
<br><br>
<table id="demo"></table><script>
function loadXMLDoc() {var xhttp = new XMLHttpRequest();xhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {myFunction(this);}};xhttp.open("GET", "cd_catalog.xml", true);xhttp.send();
}
function myFunction(xml) {var i;var xmlDoc = xml.responseXML;var table="<tr><th>Artist</th><th>Title</th></tr>";var x = xmlDoc.getElementsByTagName("CD");for (i = 0; i <x.length; i++) {table += "<tr><td>" +x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue +"</td><td>" +x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue +"</td></tr>";}document.getElementById("demo").innerHTML = table;
}
</script></body>
</html>

当用户点击上面的"获取我收藏的 CD"这个按钮,就会执行 loadXMLDoc() 函数。

loadXMLDoc() 函数创建 XMLHttpRequest 对象,添加当服务器响应就绪时执行的函数,并将请求发送到服务器。

当服务器响应就绪时,会构建一个 HTML 表格,从 XML 文件中提取节点(元素),最后使用 XML 数据的 填充 id=“demo” 的表格元素

POST || GET 参考链接:[点这里]:

  • HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的 查,改,增,删 4个操作。
  • GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如login.actionname=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母或数字,则原样发送;如果是空格,转换为+;如果是中文或其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII码值。而与之对应的,POST把提交的数据放置在HTTP包的包体中。
  • POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为:(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击(CSRF,跨站请求伪造,也被称为:one click attack/session riding)。

AJAX(二)ResponseText、onreadystatechange 事件、readyState、status、ASP和PHP、数据库实例、XML实例相关推荐

  1. 简单解析Ajax中onreadystatechange事件的readyState属性和status属性

    简单解析Ajax中的onreadystatechange 事件 onreadystatechange 事件 当请求被发送到服务器时,我们需要执行一些基于响应的任务.每当 readyState 改变时, ...

  2. ajax打开后回调事件,[AJAX系列]onreadystatechange事件

    onreadystatechange事件: 当请求被发送到服务器时,我们需要执行一些基于响应的任务 每当readyState改变时,就会触发onreadystatechange事件 readyStat ...

  3. ajax的readyState状态值和onreadystatechange事件,帮助你更好的理解ajax

    认识ajax的readyState状态值和onreadystatechange事件 1.readyState是什么? 2.readyState它有多少个值,分别代表什么? 3.认识ajax的onrea ...

  4. IE中同一个url第二次AJAX调用无法触发onreadystatechange事件

    如果第二次通过XMLHttpRequest去请求一个URL,则不会触发onreadystatechange时间,虽然从调试插件来看,ie是进行了这次请求. 后来发现,这个是因为在ie下,如果请求的UR ...

  5. AJAX —— onreadystatechange 事件

    当请求被发送到服务器时,我们需要执行一些基于响应的任务.每当 readyState 改变时,就会触发 onreadystatechange 事件. readyState 属性存有 XMLHttpReq ...

  6. 对ajax中onreadystatechange事件执行流程的理解

    对Ajax中onreadystatechange事件执行流程的理解 onreadystatechange 事件 当请求被发送到服务器时,我们需要执行一些基于响应的任务. 每当 readyState 改 ...

  7. AJAX - onreadystatechange 事件

    AJAX - onreadystatechange 事件 1.当请求被发送到服务器时,我们需要执行一些基于响应的任务. 2.每当 readyState 改变时,就会触发 onreadystatecha ...

  8. Ajax onreadystatechange事件

    onreadystatechange 事件 当请求被发送到服务器时,我们需要执行一些基于响应的任务. 每当 readyState 改变时,就会触发 onreadystatechange 事件. rea ...

  9. ajax的4种状态事件,AJAX - onreadystatechange 事件

    onreadystatechange 事件 当请求被发送到服务器时,我们需要执行一些基于响应的任务. 每当 readyState 改变时,就会触发 onreadystatechange 事件. rea ...

最新文章

  1. Windows XP鲜为人知的70招
  2. linux 裸设备 逻辑卷,Linux通过逻辑卷使用裸设备
  3. tkinter 笔记:列表部件 listbox (莫烦python 笔记)
  4. stderr和stdout(printf、fprintf、sprintf)(转)
  5. Redis-学习笔记06【Redis案例】
  6. 第十三节、SURF特征提取算法
  7. Linux驱动设计ioctl函数的cmd参数不能为2
  8. 赛我 v.s Fzone v.s 喔赛 用户体验对比分析
  9. icp光谱仪的工作原理_创想仪器(GLMY)光电直读光谱仪和X荧光光谱仪的区别
  10. 编程:OJ中使用C编程最基础的操作
  11. Code blocks调试教程
  12. 电工模拟接线软件 app_电气接线方法以及线号管正确方向
  13. ACM比赛代码文件读写调试方案
  14. 写给一个外汇女交易员的信(连载二)
  15. 什么是HTTP代理?
  16. CSS动画:梦幻西游
  17. 2017广州(国际)演艺设备、智能声光产品技术展览会GETshow会刊(参展商名录)
  18. FDC2214/2114使用说明及资料分享
  19. iOS基础_C语言第一讲
  20. 儒略历--Java代码(附带发现了一些问题)

热门文章

  1. 比尔盖茨的11条人生箴言
  2. Ctp接口 Tick数据转换成3秒钟,5秒钟,15秒钟,1分钟,3分钟,5分钟,n分钟周期的K线数据
  3. DS1302时钟芯片时序
  4. π120M60代替ADuM2210SRIZ 双通道数字隔离器 电路简单速度快
  5. 如何在 WSL 下实现 NGINX 反向代理
  6. 福建师范大学2022年2月课程考试《小学科学教育》作业考核试题
  7. MODBUS转PROFINET(PROFINET转MODBUS)协议转换器转换模块网关网桥总线桥在储油行业的应用配置方法(上)
  8. sketchup自学教程_su草图大师快捷键与如何渲染
  9. python 动态规划 旅行商问题_旅行商问题动态规划解法(python版)
  10. Hadoop集群安装和搭建(全面超详细的过程)