AJAX(Asynchronous JavaScript And XML)是一种用于创建交互式网页的技术,允许在不刷新页面的情况下与服务器进行通信,从而实现页面的局部更新。
AJAX可以通过多种方式实现,包括原生JavaScript、jQuery、fetch函数以及第三方库(如axios)。
原生AJAX通过XMLHttpRequest
对象实现,是AJAX功能的基础。
XMLHttpRequest
对象var xhr = new XMLHttpRequest();
xhr.open(method, url); // method: 请求方法(GET、POST等),url: 请求地址
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(body); // GET请求不传body参数,POST请求需要传入请求体
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var responseText = xhr.responseText; // 获取响应文本
console.log(responseText);
}
};
jQuery提供了简化的AJAX方法,如$.get
、$.post
和$.ajax
。
$.ajax({
url: 'http://127.0.0.1:8000/server',
type: 'GET',
dataType: 'json', // 响应数据类型
success: function(data) {
console.log(data);
},
error: function() {
console.log('请求失败');
}
});
Fetch是现代浏览器提供的原生API,用于发送HTTP请求。它返回一个Promise对象,支持Promise链式调用。
fetch('http://127.0.0.1:8000/server', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}).then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
Axios是一个基于Promise的HTTP客户端,支持浏览器和Node.js环境。它提供了简洁的API和丰富的功能,如拦截请求和响应、自动转换JSON数据等。
axios.get('http://127.0.0.1:8000/server')
.then(response => console.log(response.data))
.catch(error => console.error('Error:', error));
AJAX的核心是通过HTTP协议与服务器进行通信。了解HTTP请求和响应的基本结构对于使用AJAX非常重要。
method URL 协议版本
(如:GET /index.html HTTP/1.1
)Host
、Content-Type
、Cookie
等)status statusText
(如:200 OK
)Content-Type
、Content-Length
等)AJAX的数据传输格式主要有以下几种:
name=Tom&age=20
){"name": "Tom", "age": 20}
)AJAX默认遵守同源策略,即协议、域名和端口号必须完全相同。跨域问题可以通过以下方式解决:
标签的跨域能力,只支持GET请求。Access-Control-Allow-Origin
,允许跨域请求。JSONP通过动态创建标签来加载跨域资源。服务器返回的内容是一个JavaScript函数调用,客户端定义的回调函数会处理这些数据。
客户端:
function handle(data) {
console.log(data);
}
var script = document.createElement('script');
script.src = 'http://example.com/data?callback=handle';
document.body.appendChild(script);
服务器返回:
handle({"name": "Tom", "age": 20});
CORS通过在服务器响应头中设置Access-Control-Allow-Origin
来允许跨域请求。浏览器会检查该响应头,如果允许,则放行请求。
服务器设置:
response.setHeader('Access-Control-Allow-Origin', '*');
XMLHttpRequest
对象的状态码readyState
用于表示请求的当前状态:
xhr.timeout = 2000; // 设置超时时间为2秒
xhr.ontimeout = function() {
console.log('请求超时');
};
xhr.abort(); // 取消请求
xhr.onerror = function() {
console.log('网络异常');
};
<button id="btn">点击发送GET请求button>
<div id="result">div>
<script>
document.getElementById('btn').onclick = function() {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://127.0.0.1:8000/server');
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
document.getElementById('result').innerHTML = xhr.responseText;
}
};
};
script>
<button id="btn">点击发送POST请求button>
<div id="result">div>
<script>
document.getElementById('btn').onclick = function() {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://127.0.0.1:8000/server');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('name=Tom&age=20');
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
document.getElementById('result').innerHTML = xhr.responseText;
}
};
};
script>
<button id="btn">点击发送JSON请求button>
<div id="result">div>
<script>
document.getElementById('btn').onclick = function() {
var xhr = new XMLHttpRequest();