上一篇
AJAX(Asynchronous JavaScript and XML)本质是浏览器与服务器之间的局部更新技术,通过以下四步实现:
XMLHttpRequest
或Fetch API
。const xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xhr.open('GET', 'https://api.example.com/data', true); // 异步请求 xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { // 4代表请求完成 if (xhr.status === 200) { console.log('成功:', xhr.responseText); } else { console.error('错误:', xhr.statusText); } } }; xhr.send(JSON.stringify({id: 123})); // POST请求需传参
true
。xhr.overrideMimeType('text/plain; charset=UTF-8')
。FormData
对象。fetch('https://api.example.com/data') .then(response => { if (!response.ok) throw new Error('请求失败'); return response.json(); }) .then(data => console.log('数据:', data)) .catch(err => console.error('捕获异常:', err));
async function postData() { try { const res = await fetch('https://api.example.com/post', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title: '原生JS' }) }); const data = await res.json(); console.log('服务器返回:', data); } catch (err) { console.error('请求中断:', err); } }
const data = await response.json();
body: new FormData(document.querySelector('form'))
const timeoutId = setTimeout(() => { fetchAbort.abort(); }, 5000); const fetchAbort = new AbortController();
特性 | XMLHttpRequest | Fetch API |
---|---|---|
语法 | 事件驱动(onreadystatechange ) |
基于Promise |
默认行为 | 自动解析XML | 需手动解析(如.json() ) |
超时控制 | xhr.timeout |
AbortController |
浏览器兼容性 | 兼容旧版浏览器 | 现代浏览器支持 |
async function fetchWithRetry(url, retries = 3) { try { const response = await fetch(url); if (!response.ok) throw new Error('HTTP错误'); return response.json(); } catch (err) { if (retries > 0) { await new Promise(res => setTimeout(res, 1000)); return fetchWithRetry(url, retries - 1); } throw err; } }
// 客户端发送时压缩 const encoder = new TextEncoder(); const data = encoder.encode(JSON.stringify(largeData)); fetch(url, { body: data, headers: { 'Content-Encoding': 'gzip' } }); // 服务端需配合解压
fetch(url, { credentials: 'include', // 携带Cookie headers: { 'X-CSRF-Token': csrfToken, 'Content-Security-Policy': 'default-src 'self'' } });
<div id="comments"></div> <button onclick="loadComments()">加载评论</button> <script> async function loadComments() { const container = document.getElementById('comments'); try { const res = await fetch('/api/comments'); const comments = await res.json(); container.innerHTML = ''; comments.forEach(comment => { const div = document.createElement('div'); div.textContent = `${comment.user}: ${comment.content}`; container.appendChild(div); }); } catch (err) { container.innerHTML = '<p style="color:red">加载失败</p>'; } } </script>
Ctrl+Shift+E
)Q1:Fetch请求404/500错误不触发catch
?
A:Fetch默认只捕获网络错误,需手动检查response.ok
。
Q2:如何处理AJAX跨域问题?
A:服务端需配置CORS头,如Access-Control-Allow-Origin: *
。
Q3:XMLHttpRequest与Fetch如何选择?
A:追求现代语法和简洁性选Fetch;需兼容旧版浏览器或需要更精细控制选XMLHttpRequest。
您可以全面掌握原生JS实现AJAX的方法,并结合2025年的最新实践进行开发! 🚀
本文由 业务大全 于2025-08-27发表在【云服务器提供商】,文中图片由(业务大全)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vds.7tqx.com/wenda/756195.html
发表评论