JavaScript下的ajax

  • 传统的web站使用一个网页表单,向服务器GET或者POST数据。用户需要等待服务器的响应,并且需要加载页面

  • 而Ajax技术会利用ajax对象通过使用HTTP协议,向服务器进行请求,并得到来自服务器的响应,但是不加载页面。用户可以停在同一页面,用户不会注意到脚本在后台请求过页面或者向服务器发送过数据

一、JavaScript下的Ajax

复习:在JS中利用没有定义的变量时会弹出错误,而利用没有定义的属性时则会提示undifined

1、创建Ajax对象

// 创建xhr对象
if( typeof XMLHttpRequest != 'undefined' ){
    var oXhr =  new XMLHttpRequest();
}else if(typeof ActiveXObject != 'undefined'){
    //低版本的浏览器
    var oXhr =  new ActiveXObject('Microsoft.XMLHTTP');
}else{
    throw new Error('不支持ajax')
}

2、准备请求方法和请求地址

GET方法请求:

/*
 * 第一个方法:open(参数1,参数2,参数3)
 * 参数1:要发送请求的类型
 * 参数2:请求的url
 * 参数3:是否异步发送请求的布尔值
 */

oXhr.open('get','handle.php?name=jack',true); //调用open方法并不会正真发送请求,而只是启动一个请求以备发送

POST方法请求:

var postStr = "username=jack&password=123";
oXhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

setRequestHeader()方法的一个常用用途是使用POST请求时,将Content-Type的头部信息设置为表单提交的内容类型

3、发送请求

oXhr.send();
//post
oXhr.send(postStr);

4、处理响应

接收状态值(readyState):

  • 0 (未初始化)还没有调用open()方法;
  • 1 (载入)已调用send()方法,正在发送请求;
  • 2 (载入完成)send()方法完成,已收到全部相应内容;
  • 3 (解析)正在解析相应内容;
  • 4 (完成)相应内容解析完成,可以在客户端调用了;
# http状态码(status):最常见的为200,表示读取成功;
# onreadystatechange: 表示返回状态;
# responseText: 读取的文件内容

oXhr.onreadystatechange = function(){
    console.log(oXhr.readyState);
    if( oXhr.readyState == 4 ){
        if( oXhr.status == 200 ){
            console.log('success:'+oXhr.responseText);
        }else{
            console.log('fail:'+oXhr.responseText);
        }
    }else{
        console.log('依旧在取经的路上');
    }
}

demo.php

var xhr = function(){
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
    }else{
        return new ActiveObject('Micrsorf.XMLHttp');
    }
}();
console.log(xhr.readyState);

xhr.onreadystatechange = function(){
    switch(xhr.readyState){
        case 0 : 
            console.log(0,'未初始化....');
            break;
        case 1 : 
            console.log(1,'请求参数已准备,尚未发送请求...');
            break;
        case 2 : 
            console.log(2,'已经发送请求,尚未接收响应');
            break;
        case 3 : 
            console.log(3,'正在接受部分响应.....');
            break;
        case 4 : 
            console.log(4,'响应全部接受完毕');
            if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
                document.write(xhr.responseText);
            }else{
                document.write('error:' + xhr.status);
            }
            break;
    }
}
xhr.open('get','handle.php?name=jack');
xhr.send(null);

Json数据返回处理

if( isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ){

    header('content-type:application/json;charset=utf8');
    $arr = [
        ['keyword'=>'php'],
        ['keyword'=>'mysql'],
        ['keyword'=>'linux'],
        ['keyword'=>'apache']
    ];
    exit(json_encode(['status'=>1,'data'=>$arr]));
}else{
    var_dump($_SERVER['HTTP_X_REQUESTED_WITH']);
}