AJAX的概念?
AJAX 全称 Async Javascript and XML
AJAX = 异步 JavaScript + XML
AJAX 是一种用于创建交互式网页应用的网页开发技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在 不重新加载 整个网页的情况下,对网页的某部分进行更新。
AJAX的原理
用JavaScript动作通过XmlHttpRequest(Http请求)对象向服务器发送异步请求
=>服务器响应
=>接收返回数据
=> 用JavaScript操作DOM更新页面
如何使用
1、XHR创建对象
用XmlHttpRequest()构造函数初始化一个xmlhttp实例对象
var xmlhttp;
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else {
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
2、XHR 请求
AJAX向服务器发送请求open()和send()
GET和POST区别
1、GET
//案例(可能得到缓存结果)
xmlhttp.open("GET","/try/ajax/demo_get.php",true);
xmlhttp.send();
//避免德奥缓存结果
xmlhttp.open("GET","/try/ajax/demo_get.php?t=" + Math.random(),true);
xmlhttp.send();
//通过GET向服务器发送信息
xmlhttp.open("GET","/try/ajax/demo_get2.php?fname=Henry&lname=Ford",true);
xmlhttp.send();
2、POST
//案例
xmlhttp.open("POST","/try/ajax/demo_post.php",true);
xmlhttp.send();
//如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:
xmlhttp.open("POST","/try/ajax/demo_post2.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("fname=Henry&lname=Ford");
异步 - True 或 False?
AJAX 指的是异步 JavaScript 和 XML(Asynchronous JavaScript and XML)。
默认值是true
对于 web 开发人员来说,发送异步请求是一个巨大的进步。
很多在服务器执行的任务都相当费时。AJAX 出现之前,
这可能会引起应用程序挂起或停止。
通过 AJAX,JavaScript 无需 等待服务器的响应,而是:
- 在等待服务器响应时执行其他脚本
- 当响应就绪后对响应进行处理
XMLHttpRequest 对象如果要用于 AJAX 的话,其 open() 方法的 async 参数必须设置为 true;
xmlhttp.open("GET","ajax_test.html",true);
1、Async=true
当使用 async=true 时,请规定在响应处于onreadystatechange事件中的就绪状态时执行的函数:
//实例
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("xhh").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
xmlhttp.send();
2、Async = false
如需使用 async=false,请将 open() 方法中的第三个参数改为 false:
xmlhttp.open("GET","test1.txt",false);
我们 不推荐 使用 async=false,但是对于一些小型的请求,也是可以的。
请记住,JavaScript 会等到服务器响应就绪才继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止。
注意: 当您使用 async=false 时,请 不要 编写 onreadystatechange
函数 - 把代码放到 send() 语句后面即可:
xmlhttp.open("GET","/try/ajax/ajax_info.txt",false);
xmlhttp.send();
document.getElementById("xhh").innerHTML=xmlhttp.responseText;
3、XHR 响应
响应的属性有
1、responseText 获取字符串形式的响应数据
2、responseXML 获取XML形式的响应数据
//当用户点击上面的"获取我收藏的 CD"这个按钮,就会执行 loadXMLDoc() 函数。
//loadXMLDoc() 函数创建 XMLHttpRequest 对象,添加当服务器响应就绪时执行的函数,并将请求发送到服务器。
//当服务器响应就绪时,会构建一个 HTML 表格,从 XML 文件中提取节点(元素),最后使用 XML 数据的 填充 id="demo" 的表格元素:
// 异步加载 XML 文档
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;
}
4、XHR readyState
onreadystatechange 事件
当请求被发送到服务器时,我们需要执行一些基于响应的任务。
每当 readyState 改变时,就会触发 onreadystatechange 事件。
readyState 属性存有 XMLHttpRequest 的状态信息。
// 一般我们想要获取数据之前会判断状态信息
//xmlhttp.readyState==4 && xmlhttp.status==200 表示:请求完成并且成功返回
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("xhhh").innerHTML= xmlhttp.responseText;
}
}
5、XHR ASP/PHP
在与ASP(Active Server Pages)和PHP这样的服务器端脚本语言交互时。
AJAX的主要作用是允许网页在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。
这种能力极大地提升了用户体验,使得Web应用更加流畅和响应迅速。
ASP
function callASPNET() {
var xhr = new XMLHttpRequest();
xhr.open("POST", "AjaxService.asmx/HelloWorld", true);
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
var response = JSON.parse(xhr.responseText).d;
alert(response);
}
};
xhr.send('{}'); // 发送空JSON对象,因为ASP.NET WebMethod可能需要它
}
// 调用函数 callASPNET();
PHP
function callPHP() {
var xhr = new XMLHttpRequest();
xhr.open("POST", "hello.php", true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200)
{
alert(xhr.responseText);
}
};
xhr.send(); // 对于PHP示例,不需要发送任何数据 }
// 调用函数 callPHP();
AJAX 实例
创建一个简单的XMLHttpRequest,从一个TXT文件中返回数据。
创建一个简单的XMLHttpRequest,从一个XML文件中返回数据。
检索资源(文件)的头信息。
检索资源(文件)的指定头信息。
当用户在文本框内键入字符时网页如何与Web服务器进行通信
用AJAX网页如何获取数据库中的信息
创建一个XMLHttpRequest从XML文件中检索数据并显示在一个HTML表格中。
用一个callback函数创建一个XMLHttpRequest,并从一个TXT文件中检索数据。
AJAX JSON 实例
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,
JSON的语法规则
- 对象(Object) :使用大括号
{}表示,对象内部由若干条数据组成,每条数据由键值对(key:value)组成,键值对之间使用逗号,分隔。例如:{"name": "John", "age": 30}。 - 数组(Array) :使用中括号
[]表示,数组可以包含多个对象或其他数据类型(如字符串、数字等)。例如:[{"name": "John", "age": 30}, {"name": "Jane", "age": 25}]。 - 数据类型:JSON支持的数据类型包括字符串(String)、数字(Number)、对象(Object)、数组(Array)、布尔值(Boolean,即true和false)、null。
- 键和值的引号:JSON中的键和字符串类型的值必须用双引号
"包围,且双引号需要使用转义字符``进行转义(如果需要在字符串中包含双引号)。
JSON的应用场景 数据交换、数据存储、数据可视化
使用
JSON.parse()方法将数据转换为 JavaScript 对象
1、获取json数据
function loadXMLDoc()
{
var xmlhttp;
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)
{
var myArr = JSON.parse(this.responseText);
myFunction(myArr)
}
}
xmlhttp.open("GET","/try/ajax/json_ajax.json",true);
xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xmlhttp.send();
}
function myFunction(arr) {
var out = "";
var i;
for(i = 0; i < arr.length; i++) {
out += '<a href="' + arr[i].url + '">' +
arr[i].title + '</a><br>';
}
document.getElementById("myDiv").innerHTML=out;
}
2、发送json数据
xmlhttp.send(JSON.stringify({ "email": "admin@runoob.com", "response": { "name": "runoob" } }));