JavaScript Fetch无法展示HTML页面文本内容,该用Fetch还是FileReader?
问题解答
1. fetch是否适合这个场景?FileReader呢?
fetch完全适合读取同目录下的静态文本文件,这正是它的典型使用场景之一。而FileReader不适合这个需求——它的作用是处理用户通过文件选择器(比如<input type="file">)上传到浏览器的本地文件,不是用来请求服务器上的静态资源的。
2. 你的代码为什么不工作?
核心错误是添加了{ mode: 'no-cors' }选项:
- 当使用
no-cors模式时,fetch返回的是不透明响应(opaque response),这种响应无法读取任何内容(包括response.text()),浏览器会限制你访问响应体。 - 同目录下的文件和HTML属于同源,根本不需要
no-cors模式,这个选项反而破坏了正常的响应读取。
另外,你拼接文件路径的写法可以简化,直接用./a.txt就能指向同目录的文件,不需要手动截取location.href。
3. 修正后的代码
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Untitled Page</title> <meta name="generator" > <style type="text/css"> </style> <script type="text/javascript" defer> async function getTextFile1() { try { // 直接用相对路径,去掉no-cors模式 const response = await fetch('./a.txt'); // 先检查响应是否成功 if (!response.ok) { throw new Error(`请求失败,状态码:${response.status}`); } const fileText = await response.text(); const tagElement = document.getElementById("about_layer"); tagElement.innerText = fileText; } catch (error) { console.error('读取文件出错:', error); } } window.onload = getTextFile1; </script> </head> <body> <div>should be placed here</div> <div id="about_layer"></div> </body> </html>
4. 测试注意事项
不要直接双击打开本地HTML文件(此时协议是file://),因为浏览器对file://协议下的fetch请求有安全限制,可能会导致请求失败。你需要在本地服务器环境下测试:
- 用VS Code的Live Server插件启动服务
- 用Node.js的
http-server工具启动本地服务器
内容的提问来源于stack exchange,提问作者mehrdad
相关产品推荐
相关产品推荐

