如何将文本文件的内容加载到 javascript 变量中?

IT技术 javascript
2021-01-21 21:51:23

我在我的网络应用程序http://localhost/foo.txt的根目录中有一个文本文件,我想将它加载到 javascript 中的一个变量中。在 groovy 中,我会这样做:

def fileContents = 'http://localhost/foo.txt'.toURL().text;
println fileContents;

如何在 javascript 中获得类似的结果?

6个回答

XMLHttpRequest,即AJAX,没有XML。

您执行此操作的确切方式取决于您使用的 JavaScript 框架,但如果我们忽略互操作性问题,您的代码将如下所示:

var client = new XMLHttpRequest();
client.open('GET', '/foo.txt');
client.onreadystatechange = function() {
  警报(客户端。响应文本);
}
客户端发送();

但是,通常来说,XMLHttpRequest 并非在所有平台上都可用,因此做了一些胡说八道。再一次,您最好的选择是使用像 jQuery 这样的 AJAX 框架。

一个额外的考虑:这只会在 foo.txt 位于同一域中时起作用。如果它位于不同的域中,同源安全策略将阻止您读取结果。

应修改答案以包括检查client.readyState属性值。我一直在贬低它,直到它成为现实,人们不会阅读评论来发现答案只是部分正确。
2021-03-12 21:51:23
此外,您可以执行client.onloadend并获取完整的数据
2021-03-15 21:51:23
同源策略的解决方法是使用jQuery 支持的JSONP(对于客户端部分)
2021-03-16 21:51:23
补充一点可能很有用,在 onreadystatechange 中,您可以访问 XMLHttpRequest 对象的 readystate 属性(在示例中:client.readystate)以了解状态,因为 onreadystatechange 事件是为加载、加载、...引发的。 .. 所以你必须在 onreadystatechange 中等待 client.readystate == 4 才能使用 client.responseText。
2021-03-23 21:51:23
@GameAlchemist:偶然发现你的好答案。我只是想指出,在大多数浏览器中,readyState 是驼峰式的,所以代码应该是这样的:if (client.readyState === 4){ }
2021-04-01 21:51:23

这是我在 jquery 中的做法:

jQuery.get('http://localhost/foo.txt', function(data) {
    alert(data);
});
@Akronix 有没有一种简单的方法可以在本地测试它?我不断收到跨域请求错误
2021-03-10 21:51:23
@Akronix 如果您省略该http://...部分,因为它位于同一个域中,它将起作用,例如jQuery.get("foo.txt", ...).
2021-03-13 21:51:23
这似乎不适用于纯表格文本数据(docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests
2021-03-14 21:51:23
@pufferfish 如果您指定dataType参数,它将使用纯数据,请参阅api.jquery.com/jQuery.get/
2021-03-14 21:51:23
请注意,如果您在本地使用file://ie:对其进行测试,这将不起作用file:///example.com/foo.htmlFirefox 抱怨语法错误并且 Chrome 阻止,因为它将它视为跨域请求。
2021-03-25 21:51:23

2019 年更新:使用 Fetch:

fetch('http://localhost/foo.txt')
  .then(response => response.text())
  .then((data) => {
    console.log(data)
  })

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API

async函数内部,您可以const text = await fetch(url).then($ => $.text())使回调变平。
2021-03-13 21:51:23
现在是 2019 年,fetch 是一件美丽的事情。这是所有现代浏览器的方式,包括刚刚赶上的三星互联网......
2021-03-19 21:51:23
是的 Fetch 是(最近的)标准,而不是专有扩展。
2021-03-28 21:51:23
很好的解决方案。即使对于一个完整的初学者来说,这也非常容易。存储在变量中而不是上一步中的 console.log,现在可以在任何地方使用。
2021-04-07 21:51:23
一个紧凑而有效的代码,维克,谢谢你。为了实现错误处理,是否可以response.ok在代码中的某处放置一些(或等效的)?我不是很有经验fetch,所以我不知道设置它的确切位置。
2021-04-09 21:51:23

如果您只想要文本文件中的常量字符串,您可以将其包含为 JavaScript:

// This becomes the content of your foo.txt file
let text = `
My test text goes here!
`;
<script src="foo.txt"></script>
<script>
  console.log(text);
</script>

从文件加载的字符串在加载后可供 JavaScript 访问。`(反引号)字符开始和结束模板文字,允许在文本块中使用 " 和 ' 字符。

当您尝试在本地加载文件时,这种方法很有效,因为 Chrome 不允许对具有该file://方案的URL 进行 AJAX

在这一点上,即使是 Microsoft 也即将淘汰 IE,并且可以通过使其成为返回字符串的函数而不是使用“let”设置变量来简化作用域
2021-03-12 21:51:23
这将是一个非常巧妙的解决方案。但是 IE11 不支持模板文字,并且“let”变量在功能块内部时会超出范围,所以这个实现充满了危险——当心。
2021-03-29 21:51:23

2020 年更新:将Fetch与 async/await 结合使用

const response = await fetch('http://localhost/foo.txt');
const data = await response.text();
console.log(data);

注意await只能在async函数中使用。一个更长的例子可能是

async function loadFileAndPrintToConsole(url) {
  try {
    const response = await fetch(url);
    const data = await response.text();
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

loadFileAndPrintToConsole('https://threejsfundamentals.org/LICENSE');

嗯,一切都很好,除了起源需要有 cors,这不一定启用或适合很多人。
2021-03-13 21:51:23
对。然而,为了非 cors 起源,AJAX 更好。
2021-03-13 21:51:23
XMLHttpRequest 有同样的限制
2021-03-15 21:51:23
这就像在说 Q:“你如何从银行取钱” A:“去银行写一张现金支票”。你:“这一切都很好,除非我想从需要授权书的其他人的账户中取钱,但我没有大多数账户的授权书”。CORS 的存在是有原因的。由服务器决定您是否有权读取资源。
2021-04-01 21:51:23