AJAX的原理就是通过XMLHttpRequest对象向服务器发起异步请求。现在一般主流的浏览器都支持该对象,不过早期的IE5、6只支持ActiveXObject。所以,我们需要做出兼容
var xmlhttp = null;
if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();
}else{
xmlhttp = new ActiveObject('Microsoft.XMLHTTP');
}
方法 | 描述 |
---|---|
abort() | 取消当前响应,关闭连接并且结束任何未决的网络活动。此方法将会把readyState状态值重置为0 |
getAllResponseHeaders() | 把HTTP响应头部作为未解析的字符串返回。如果readyState值小于3,则返回null;否则返回服务器发送的所有HTTP响应的头部。 |
getResponseHeader() | 返回 指定 的HTTP响应头部的值 |
open() | 初始化HTTP请求参数,如URL和请求方法(下面会说明具体参数),但是不发送请求 |
send() | 发送HTTP请求,使用传递给open()方法的参数 |
setRequestHeader() | 向一个打开但未发送(即使用了open但未使用send)的请求设置或添加HTTP请求 |
这里需要注意的是,当使用POST请求时,必须要设置请求头
open( method,url,async,username,password )
参数 | 描述 |
---|---|
method | 可以是GET、POST、PUT、DELETE或者HEAD |
url | 我们请求的地址 |
async | 是否请求为异步,默认为true(异步) |
username和password为可选 | 为URL所需授权提供认证资格 |
属性或事件 | 描述 |
---|---|
readyState属性 | HTTP请求的状态。当一个XMLHttpRequest对象被初次创建时,这个属性的值从0开始,直到接受到完整的HTTP响应,这个值增加到4。 |
onreadystatechange事件 | 每次readyState的值改变的时候,都可以调用这个句柄函数。值得注意的是,当readyState为3时,他可能调用多次。因为当readyState为3时,是一个持续接受数据的过程。 |
status属性 | 由服务器返回的HTTP状态码,如200表示成功 |
statusText属性 | status返回了与状态码对应的状态名称。例如当状态为200时,能么将会返回“OK” |
responseXML属性 | 对请求的响应,解析为XML并作为Document对象返回。 |
responseText属性 | 到目前为止,从服务器接收到的响应体(具体数据) |
这上面中,readyState尤为重要,因为上面所介绍的属性或事件都有readyState的参与,readyState的状态值如下
状态值 | 名称 | 描述 |
---|---|---|
0 | Uninitialized | 初始化状态.XMLHttpRequest对象已创建或已被abort()方法重置 |
1 | Open | open()方法已被调用,但是send()方法未被调用。即请求还没有被发送 |
2 | Send | send()方法已被调用,HTTP请求已发送到Web服务器。此时请求已发送 |
3 | Receiving | 所有响应头部已经被接收到。响应体(即数据)已被接受到,但还未完成。因为数据接收是一段过程 |
4 | Loaded | HTTP响应已被完全接收。即从服务器传来的数据已全部接收完毕。 |
function Ajax(){
// 创建ajax对象
let ajax = new Object();
// 做出兼容
ajax.createServer = function(){
var xmlRequest = false;
if(window.XMLHttpRequest){
xmlRequest = new XMLHttpRequest();
}else if(window.ActiveXObject){
xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlRequest;
};
// 建立回调函数
ajax.changeFunction = function( callback){
if(ajax.xmlRequest.readyState == 4 && ajax.xmlRequest.status == 200){
callback(ajax.xmlRequest.responseText);
}
};
// 封装get方法
ajax.get = function(url,callback,async){
// 设置回调
if(!callback){
alert('请传入回调函数');
}else{
ajax.xmlRequest.onreadystatechange = ajax.changeFunction;
}
// 打开设置请求
ajax.xmlRequest.open('GET',url,async);
// 发送请求
ajax.xmlRequest.send();
};
// 封装POST方法
ajax.post = function(url,callback,string,async){
//处理要向服务器提交的参数
if(typeof string == 'object'){
var str = '';
try{
for(let i in string){
//把JSON对象转化为name = Tom & age = 19的形式
str += i + '=' + string[i] + '&';
}
// 将最后的 '&' 删除
string = str.substr(0,str.length-1);
}catch(err){
// 如果中途报错,证明传入的参数的格式不对
alert('请传入正确的参数格式!');
}
}
// 设置回调
if(!callback){
alert('请传入回调函数');
}else{
ajax.xmlRequest.onreadystatechange = ajax.changeFunction;
}
// 打开设置请求
ajax.xmlRequest.open('GET',url,async);
//设置请求头,post方法中,这一步骤是必须的
ajax.xmlRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
// 发送请求
ajax.xmlRequest.send(string);
}
ajax.xmlRequest = ajax.createServer();
// 返回ajax对象
return ajax;
}
// 调用封装的AJAX
Ajax().get('xxx/index',callback,true);
使用express作为服务端,因为语法前端都看得懂
路由分离
//app.js
...
var back = require('../xxx/back');
app.use('/index',back); //将请求转发给back.js文件处理
//back.js
var express = require('express');
var router = express.Router();
app.get('/',function(req,res,next){
res.send('访问后台成功!');
});
// 假如前端发送名字和城市过来后台
app.post('/',function(req,res,next){
res.json({name:req.name,city:req.city});
});
//这里GET到的路径,是剔除了index后的路径。如果这里的路径再加上index的话,那么前端访问将是xxx/index/index
方法 | 描述 |
---|---|
send() | 返回文本数据 |
json() | 返回JSON数据 |
render() | 返回模板文件(即HTML页面) |
① 对于GET请求发送来的参数,用req.query;获取参数
console.log(req.query)
② 对于POST请求发送来的参数,用req.body;获取参数
console.log(req.body);