关于Ajax的jQuery、Vue.js、原生js的各个版本的实现对比
目录
前言
下面对于各个版本的Ajax代码,想要实际测试它们,可以把它命名为server2.html,然后放在当前目录views目录下面。具体的教程可以看测试Ajax的Nodejs服务端代码
1、原生js实现
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>原生js版本</title>
</head>
<body>
<div><button>点击我发送get请求</button></div>
<div><button>点击我发送post请求</button></div>
</body>
<script>
document.getElementsByTagName('button')[0].addEventListener('click', function () {
ajax('get', 'http://127.0.0.1:3000/get', function (response) {
alert(JSON.parse(response)['message']);
});
});
document.getElementsByTagName('button')[1].addEventListener('click', function () {
ajax('post', 'http://127.0.0.1:3000/post', function (response) {
alert(JSON.parse(response)['message']);
}, JSON.stringify({ name: "post测试" }));
});
function ajax(method, url, callback, data, async) {
data = data || null;
async = async || true;
var xhr = new window.XMLHttpRequest || ActiveXObject('Microsoft.XMLHTTP');
xhr.open(method, url, async);
xhr.setRequestHeader('content-type', 'application/json');
xhr.send(data);
console.log("发送的数据是:" + data);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
console.log("完成请求,响应就绪");
callback(this.responseText);
}
}
}
}
</script>
</html>
2、原生js实现——Promise版本
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>原生js版本——Promise版本</title>
</head>
<body>
<div><button>点击我发送get请求</button></div>
<div><button>点击我发送post请求</button></div>
</body>
<script>
document.getElementsByTagName('button')[0].addEventListener('click', function () {
ajax('get', 'http://127.0.0.1:3000/get').then(function (data) {
alert(JSON.parse(data).message);
}).catch(function (error) {
alert(error);
});
});
document.getElementsByTagName('button')[1].addEventListener('click', function () {
ajax('post', 'http://127.0.0.1:3000/post', JSON.stringify({ name: "post测试" })).then(function (data) {
alert(JSON.parse(data).message);
}).catch(function (error) {
alert(error);
});
});
function ajax(method, url, data, async) {
return new Promise(function (resolve, reject) {
data = data || null;
async = async || true;
var xhr = new window.XMLHttpRequest || ActiveXObject('Microsoft.XMLHTTP');
xhr.open(method, url, async);
xhr.setRequestHeader('content-type', 'application/json');
xhr.send(data);
console.log("发送的数据是:" + data);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
console.log("完成请求,响应就绪");
resolve(this.responseText);
}
else {
reject(new Error(this.statusText));
}
}
}
});
}
</script>
</html>
3、jQuery实现
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>jQuery版本</title>
<script src='https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js'></script>
</head>
<body>
<div><button>点击我发送get请求</button></div>
<div><button>点击我发送post请求</button></div>
</body>
<script>
document.getElementsByTagName('button')[0].addEventListener('click', function(){
$.get('http://127.0.0.1:3000/get', function(data, status){
alert(data.message);
});
});
document.getElementsByTagName('button')[1].addEventListener('click', function () {
$.post('http://127.0.0.1:3000/post', {
name: 'post测试',
}, function(data, status){
alert(data.message);
});
});
</script>
</html>
4、Vue.js实现
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Vue.js版本</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js"></script>
</head>
<body>
<div><button>点击我发送get请求</button></div>
<div><button>点击我发送post请求</button></div>
</body>
<script>
document.getElementsByTagName('button')[0].addEventListener('click', function(){
new Vue().$http.get('http://127.0.0.1:3000/get').then(function (res) {
alert(res.body.message);
}, function () {
console.log('请求失败处理');
});
});
document.getElementsByTagName('button')[1].addEventListener('click', function () {
new Vue().$http.post('http://127.0.0.1:3000/post', { name: "post测试"}, { emulateJSON: true }).then(function (res) {
alert(res.body.message);
}, function (res) {
console.log(res.status);
});
});
</script>
</html>
总结
- 使用原生js写ajax步骤比较麻烦,考虑的东西比较多,但是最接近底层,对于理解ajax很有帮助;
- Promise是同步的,但是.then.catch是异步的,具体可以查看验证Promise是同步的;
- jQuery实现的写法比较简洁;
- Vue.js的写法和Promise写法很像,其实内部就是通过Promise来实现的;
- 其实根据Promise可以将上面4种方法分为两类:
- 使用Promise:方法2、4
- 不使用Promise:方法1、3
- 关于这四个方法Ajax,我专门截取了一些主要的代码片断,进行了更加精确的对比,请查看原生js、jQuery和Vue.js的Ajax的详细对比