HTML 本身不具备 Ajax 能力,真正发起异步请求的是 JavaScript;表单提交非 Ajax 因无 JS 参与且无法处理响应;fetch() 和 XMLHttpRequest 是唯二原生异步请求 API,运行于 JS 上下文。

HTML 本身没有 Ajax 能力,所谓“HTML Ajax”是常见误解;真正发起异步请求的是 JavaScript,HTML 只负责静态结构。你不能用纯 HTML 发起异步请求,哪怕写 <script></script> 标签,执行逻辑也落在 JS 引擎上。
为什么 <form method="POST" action="/api" target="_blank"></form> 不算 Ajax
这是最常被误认为“Ajax”的操作:表单提交后页面跳转或新开窗口。它确实异步(不阻塞主页面渲染),但不是 Ajax——因为没有 JS 参与、无法读取响应体、无法做状态判断、无法更新局部 DOM。
- 响应结果只能靠浏览器自动导航或弹窗呈现,服务端必须返回完整 HTML 页面
- 无法捕获
400、500等 HTTP 状态码,错误会表现为白屏或跳转失败 - 无法设置请求头(如
Authorization、Content-Type) -
target="_blank"还会触发跨域限制和弹窗拦截
fetch() 和 XMLHttpRequest 才是真正的异步请求入口
现代前端异步通信只依赖这两个原生 API。它们都运行在 JS 上下文,可编程控制整个请求生命周期。
-
fetch()是 Promise-based,语法简洁,但默认不带 cookie(需显式加credentials: 'include') -
XMLHttpRequest支持进度监听(upload.onprogress)、中止(.abort()),适合大文件上传场景 - 两者都不受 HTML 解析阶段影响——哪怕 DOM 还没加载完,JS 也能发请求
- 注意:
fetch()对网络错误(如断网)抛异常,但对404、500不抛,需手动检查response.ok
用 <script src="url"></script> 加载 JSON?不行,会报错
有人尝试把接口返回 JSON 直接当 JS 脚本引入:<script src="/api/data.json"></script>。这会触发 MIME 类型错误(The script has a different MIME type),因为浏览器强制要求 text/javascript,而接口通常返回 application/json。
立即学习“前端免费学习笔记(深入)”;
- 即使服务端强行设成
text/javascript,JSON 也不是合法 JS 表达式(比如{"a":1}会报Unexpected token {) - 绕过方法只有两种:服务端包装成 JS 函数调用(JSONP,已淘汰)、或改用
fetch()+response.json() - 现代框架(React/Vue)的
useEffect或onMounted中发起请求,本质仍是调用这些底层 API
真正容易被忽略的点在于:异步请求的边界不在 HTML,而在 JS 执行时机与网络栈权限。比如 document.write() 在 DOM 加载后调用会清空页面,而 fetch() 却随时可发——这个差异决定了所有交互逻辑必须落在 JS 层,HTML 只配当容器。



















