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


155

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

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

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

Answers:


142

XMLHttpRequest,即AJAX,不带XML。

具体的执行方式取决于您使用的JavaScript框架,但是如果我们忽略互操作性问题,您的代码将类似于:

var client = new XMLHttpRequest();
client.open('GET','/foo.txt');
client.onreadystatechange = function(){
  alert(client.responseText);
}
client.send();

但是,通常来讲,并不是所有平台上都提供XMLHttpRequest,因此需要做一些判断。再一次,最好的选择是使用jQuery之类的AJAX框架。

一个额外的注意事项:仅当foo.txt在同一域上时,这才起作用。如果它在其他域中,则同源策略将阻止您读取结果。


1
同源策略的一种变通方法是使用JSONP(jQuery(对于客户端部分))也支持JSONP
OneWorld 2012年

3
可能需要补充一点,在onreadystatechange内,您可以访问XMLHttpRequest对象的readystate属性(在示例中:client.readystate)以了解状态,因为会引发onreadystatechange事件以进行加载,加载,.. ..因此,您必须等待onreadystatechange内部的client.readystate == 4才能使用client.responseText。
GameAlchemist 2012年

2
@GameAlchemist:偶然发现了您的出色答案。我只想指出,在大多数浏览器中,readyState都是驼峰式的,因此代码应如下所示:if (client.readyState === 4){ }
snorpey 2013年

6
此外,您可以执行client.onloadend并仅获取完整的数据
Athena 2014年

2
应该删除答案,以包括检查client.readyState属性值。我对此表示不满,直到人们不会阅读评论来发现答案只是部分正确。
2015年

84

这是我在jQuery中做的事情:

jQuery.get('http://localhost/foo.txt', function(data) {
    alert(data);
});

这似乎不是用普通的表格文本数据(工作时docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests
河豚

7
请注意,如果您使用file://ie:在本地对其进行测试,则此方法无效file:///example.com/foo.html。Firefox抱怨语法错误并且Chrome被阻止,因为Firefox将其视为跨域请求。
Akronix

@pufferfish,如果您指定dataType参数,它将使用纯数据,请参阅api.jquery.com/jQuery.get/
yvesonline 2015年

1
@Akronix,如果省略该http://...部分,因为它位于同一域中,它将起作用,例如jQuery.get("foo.txt", ...)
yvesonline 2015年

@Akronix是否有一种简单的本地测试方法?我不断收到跨域请求错误
ahuff44 '16

50

更新2019:使用获取:

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

https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API


4
是访存是(最新)标准,而不是专有扩展。
Laurent Caillette

1
现在是2019年,而获取是一件美事。这是所有现代浏览器(包括刚刚赶上的三星Internet)的方式……
Dave Everitt

紧凑而有效的代码Vic,谢谢。为了实现错误处理,是否可以response.ok在代码中放置一些(或等效内容)?我对的经验不是很丰富fetch,所以我不知道设置它的确切位置。
Sopalajo de Arrierez,

很好的解决方案。即使对于一个完整的初学者来说,这也非常容易。在上一步中存储在变量中,而不是console.log中,现在可以在任何地方使用。
AveryFreeman

26

如果只需要文本文件中的常量字符串,则可以将其包含为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 。


1
这将是一个非常明智的解决方案。但是IE11不支持模板文字,并且在功能块中时,“ let”变量将超出范围,因此此实现充满了危险-提防。
内维尔,

7

要记住的一件事是Javascript在客户端而不是服务器上运行。您实际上无法使用Javascript从服务器“加载文件”。发生的事情是Javascript向服务器发送了一个请求,然后服务器向回发送了所请求文件的内容。Javascript如何接收内容?这就是回调函数的作用。以爱德华为例

    client.onreadystatechange = function() {

在丹布的情况下

 function(data) {

每当数据碰巧到达时,都会调用此函数。jQuery版本隐式使用Ajax,通过将代码封装在库中,它使编码变得更容易。


7

更新2020:在异步/等待中使用提取

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');


5

这几乎可以在所有浏览器中使用:

var xhr=new XMLHttpRequest();
xhr.open("GET","https://12Me21.github.io/test.txt");
xhr.onload=function(){
    console.log(xhr.responseText);
}
xhr.send();

此外,还有新的FetchAPI:

fetch("https://12Me21.github.io/test.txt")
.then( response => response.text() )
.then( text => console.log(text) )

1

使用jQuery时,请不要使用jQuery.get,例如

jQuery.get("foo.txt", undefined, function(data) {
    alert(data);
}, "html").done(function() {
    alert("second success");
}).fail(function(jqXHR, textStatus) {
    alert(textStatus);
}).always(function() {
    alert("finished");
});

您可以使用.load它,使您的表单更加简洁:

$("#myelement").load("foo.txt");

.load还为您提供了加载部分页面的选项,这些页面可以派上用场,请参阅api.jquery.com/load/


-3

如果您的输入被构造为XML,则可以使用该importXML函数。(有关更多信息,请参见quirksmode)。

如果不是XML,并且没有用于导入纯文本的等效功能,则可以在隐藏的iframe中打开它,然后从那里读取内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.