Ajax知识点

Ajax原理

什么是Ajax
Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
Ajax的全称是Asynchronous JavaScript and XML,即异步JavaScript+XML。它并不是新的编程语言,而是几种原有技术的结合体。它由以下几种技术组合而成,包括:
• HTML/XHTML——主要的内容表示语言。
• CSS——为XHTML提供文本格式定义。
• DOM——对已载入的页面进行动态更新。
• XML——数据交换格式。
• XSLT——将XML转换为XHTML(用CSS修饰样式)。
• XMLHttp——用XMLHttpRequest来和服务器进行异步通信,是主要的通信代理。
• JavaScript——用来编写Ajax引擎的脚本语言。
实际上,在Ajax解决方案中这些技术都是可用的,不过只有三种是必须的:HTML/XHTML、DOM以及JavaScript。
XMLHttpRequest对象
当需要异步与服务器交换数据时,需要XMLHttpRequest对象来异步交换。XMLHttpRequest对象的主要属性有:
• onreadystatechange——每次状态改变所触发事件的事件处理程序。
• responseText——从服务器进程返回数据的字符串形式。
• responseXML——从服务器进程返回的DOM兼容的文档数据对象。
• status——从服务器返回的数字代码,如404(未找到)和200(已就绪)。
• status Text——伴随状态码的字符串信息。
• readyState——对象状态值。对象状态值有以下几个:
o 0 - (未初始化)还没有调用send()方法
o 1 - (载入)已调用send()方法,正在发送请求
o 2 - (载入完成)send()方法执行完成
o 3 - (交互)正在解析响应内容
o 4 - (完成)响应内容解析完成,可以在客户端调用了
对于readyState的状态值,其中“0”状态是在定义后自动具有的状态值,而对于成功访问的状态(得到信息)我们大多数采用“4”进行判断。
Ajax的核心就是是JavaScript对象XmlHttpRequest,这个对象为向服务器发送请求和解析服务器响应提供了流畅的接口。XmlHttpRequest可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。
XHR对象由IE5率先引入,在IE5中XHR对象是通过MSXML库中一个ActiveX对象实现的,根据IE版本不同可能会遇到不同版本XHR对象,而IE7+与其它现代浏览器均支持原生的XHR对象,在这些浏览器中我们只需使用XMLHttpRequest构造函数就可以构造XHR对象,因此一个浏览器兼容的创建XHR对象的函数写法大概是这个样子:

1 var xmlhttp;
2 if (window.XMLHttpRequest) {
3 // code for IE7+, Firefox, Chrome, Opera, Safari
4 xmlhttp=new XMLHttpRequest();
5 } else {
6 // code for IE6, IE5
7 xmlhttp=new ActiveXObject(“Microsoft.XMLHTTP”);
8 }

XMLHttpRequest对象用法
XMLHttpRequest对象有两个重要方法 open与send。

1 xmlhttp.open(“GET”,“ajax_info.txt”,true);
2 xmlhttp.send();

对于open方法,有几点需要注意:
a. URL是相对于当前页面的路径,也可以似乎用绝对路径。
b. open方法不会向服务器发送真正请求,它相当于初始化请求并准备发送。
c. 只能向同一个域中使用相同协议和端口的URL发送请求,否则会因为安全原因报错。
真正能够向服务器发送请求需要调用send方法,并仅在POST请求可以传入参数,不需要则发送null,在调用send方法之后请求被发往服务器。
请求发往服务器,服务器根据请求生成响应(Response),传回给XHR对象,在收到响应后相应数据会填充到XHR对象的属性,有四个相关属性会被填充:
• responseText——从服务器进程返回数据的字符串形式。
• responseXML——从服务器进程返回的DOM兼容的文档数据对象。
• status——从服务器返回的数字代码,如404(未找到)和200(已就绪)。
• status Text——伴随状态码的字符串信息。
在收到响应后第一步是检查响应状态,确保响应是否成功返回(状态为200)。

1 xhr.open(‘get’,‘default.aspx,false’); //准备同步请求
2 xhr.send();
3 if(xhr.status>=200 && xhr.status<300 || xhr.status==304){
4 //do something
5 }else{
6 //error handler
7 }

上面代码在发送同步请求的时候没问题,只有得到响应后才会执行检查status语句,但是在异步请求时,JavaScript会继续执行,不等生成响应就检查状态码,这样我们不能保证检查状态码语句是在得到响应后执行(实际上也几乎不可能,服务器再快一个HTTP请求也不会快过一条JavaScript执行数度),这时候我们可以检查XHR对象的readyState属性,该属性表示请求/响应过程中的当前活动阶段,每当readyState值改变的时候都会触发一次onreadystatechange事件。
我们可以利用这个事件检查每次readyState变化的值,当为4的时候表示所有数据准备就绪,有一点我们需要注意:必须在open方法之前指定onreadtstatechange事件处理程序。

1 xmlhttp.onreadystatechange=function(){
2 if (xmlhttp.readyState4 && xmlhttp.status200){
3 document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;
4 }
5 }
6 xmlhttp.open(“GET”,"/try/ajax/ajax_info.txt",true);
7 xmlhttp.send();

GET 还是 POST?
与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用 POST 请求:
• 无法使用缓存文件(更新服务器上的文件或数据库)
• 向服务器发送大量数据(POST 没有数据量限制)
• 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
一个简单的 GET 请求:
xmlhttp.open(“GET”,“demo_get.html”,true);
xmlhttp.send();
在上面的例子中,可能得到的是缓存的结果。
为了避免这种情况,向 URL 添加一个唯一的 ID:
xmlhttp.open(“GET”,“demo_get.html?t=” + Math.random(),true);
xmlhttp.send();
如果希望通过 GET 方法发送信息,向 URL 添加信息:
xmlhttp.open(“GET”,“demo_get2.html?fname=Henry&lname=Ford”,true);
xmlhttp.send();
一个简单 POST 请求:
xmlhttp.open(“POST”,“demo_post.html”,true);
xmlhttp.send();
如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:
xmlhttp.open(“POST”,“ajax_test.html”,true);
xmlhttp.setRequestHeader(“Content-type”,“application/x-www-form-urlencoded”);
xmlhttp.send(“fname=Henry&lname=Ford”);

open() 方法的 url 参数是服务器上文件的地址:
xmlhttp.open(“GET”,“ajax_test.html”,true);
该文件可以是任何类型的文件,比如 .txt 和 .xml,或者服务器脚本文件,比如 .asp 和 .php (在传回响应之前,能够在服务器上执行任务)。
异步 - True 或 False?
XMLHttpRequest 对象如果要用于 AJAX 的话,其 open() 方法的 async 参数必须设置为 true:
xmlhttp.open(“GET”,“ajax_test.html”,true);
对于 web 开发人员来说,发送异步请求是一个巨大的进步。很多在服务器执行的任务都相当费时。AJAX 出现之前,这可能会引起应用程序挂起或停止。
通过 AJAX,JavaScript 无需等待服务器的响应,而是:
• 在等待服务器响应时执行其他脚本
• 当响应就绪后对响应进行处理
当使用 async=true 时,规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数:

xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState4 && xmlhttp.status200){
document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open(“GET”,“ajax_info.txt”,true);
xmlhttp.send();

原生js的ajax请求

传统方法的缺点:
  传统的web交互是用户触发一个http请求服务器,然后服务器收到之后,在做出响应到用户,并且返回一个新的页面,每当服务器处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是一次很小的交互、只需从服务器端得到很简单的一个数据,都要返回一个完整的HTML页,而用户每次都要浪费时间和带宽去重新读取整个页面。这个做法浪费了许多带宽,由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。

什么是ajax
  ajax的出现,刚好解决了传统方法的缺陷。AJAX 是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
XMLHttpRequest 对象
  XMLHttpRequest对象是ajax的基础,XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。目前所有浏览器都支持XMLHttpRequest

方 法 描 述
abort() 停止当前请求
getAllResponseHeaders() 把HTTP请求的所有响应首部作为键/值对返回
getResponseHeader(“header”) 返回指定首部的串值
open(“method”,“URL”,[asyncFlag],[“userName”],[“password”]) 建立对服务器的调用。method参数可以是GET、POST或PUT。url参数可以是相对URL或绝对URL。这个方法还包括3个可选的参数,是否异步,用户名,密码
send(content) 向服务器发送请求
setRequestHeader(“header”, “value”) 把指定首部设置为所提供的值。在设置任何首部之前必须先调用open()。设置header并和请求一起发送 ('post’方法一定要 )

五步使用法:
  1.创建XMLHTTPRequest对象
  2.使用open方法设置和服务器的交互信息
  3.设置发送的数据,开始和服务器端交互
  4.注册事件(实际步骤为1.5)
  5.更新界面
下面给大家列出get请求和post请求的例子
get请求:

//步骤一:创建异步对象
var ajax = new XMLHttpRequest();
//步骤二:设置请求的url参数,参数一是请求的类型,参数二是请求的url,可以带参数,动态的传递参数starName到服务端
ajax.open('get','getStar.php?starName='+name);
//步骤三:发送请求
ajax.send();
//步骤四:注册事件 onreadystatechange 状态改变就会调用
ajax.onreadystatechange = function () {
   if (ajax.readyState==4 &&ajax.status==200) {
    //步骤五 如果能够进到这个判断 说明 数据 完美的回来了,并且请求的页面是存在的
    console.log(ajax.responseText);//输入相应的内容
    }
}

 //post请求:

//创建异步对象  
var xhr = new XMLHttpRequest();
//设置请求的类型及url
//post请求一定要添加请求头才行不然会报错
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
 xhr.open('post', '02.post.php' );
//发送请求
xhr.send('name=fox&age=18');
xhr.onreadystatechange = function () {
    // 这步为判断服务器是否正确响应
  if (xhr.readyState == 4 && xhr.status == 200) {
    console.log(xhr.responseText);
  } 
};

为了方便使用,我们可以把他封装进方法里面,要用的时候,直接调用就好了

function ajax_method(url,data,method,success) {
    // 异步对象
    var ajax = new XMLHttpRequest();

    // get 跟post  需要分别写不同的代码
    if (method=='get') {
        // get请求
        if (data) {
            // 如果有值
            url+='?';
            url+=data;
        }else{

        }
        // 设置 方法 以及 url
        ajax.open(method,url);

        // send即可
        ajax.send();
    }else{
        // post请求
        // post请求 url 是不需要改变
        ajax.open(method,url);

        // 需要设置请求报文
        ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");

        // 判断data send发送数据
        if (data) {
            // 如果有值 从send发送
            ajax.send(data);
        }else{
            // 木有值 直接发送即可
            ajax.send();
        }
    }

    // 注册事件
    ajax.onreadystatechange = function () {
        // 在事件中 获取数据 并修改界面显示
        if (ajax.readyState==4&&ajax.status==200) {
            // console.log(ajax.responseText);

            // 将 数据 让 外面可以使用
            // return ajax.responseText;

            // 当 onreadystatechange 调用时 说明 数据回来了
            // ajax.responseText;

            // 如果说 外面可以传入一个 function 作为参数 success
            success(ajax.responseText);
        }
    }
}

返回结果转json

Ajax中responseText解析json格式数据
解决ajax处理服务器端返回结果responseText中是JSON的数据。
第一,json格式的文件内容如下:
{
“city”:“ShangHai”,
“telephone”:“123456789”
}

第二,服务器端返回的json数据就是上述的内容在responseText中,现在要取出来,方法有两种:
方法1:
var json=JSON.parse(request.responseText);
alert(json.city);
方法2:
var result = request.responseText;
var jsonObject=eval("("+result+")");
alert(jsonObject.telephone);
第三,两种方法分别取出来的结果如下图
方法1对应结果:ShangHai

方法2对应结果:123456789

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值