0

我有一个 javascript 函数,我想从本地计算机读取整个文本文件。并将整个文件存储在 javascript 变量中。然后能够将此变量返回给另一个函数。我研究了不同的网站,这些网站说我可以使用 XMLHttpRequest 方法来做到这一点,并且我尝试过使用绝对文件路径和相对文件路径。我只是想以新的眼光看待这个问题,以防我遗漏了一些小东西或完全关闭。代码如下

function setNewTexts()
        {
            var txtFile = new XMLHttpRequest();
            txtFile.open("GET", "textfile.txt", true);
            txtFile.onreadystatechange = function()
            {
              if (txtFile.readyState === 4) {  // document is ready to parse.
                if (txtFile.status === 200) {  // file is found
                  allText = txtFile.responseText; 
                  lines = txtFile.responseText.split("\n");
                }
              }
            }
            txtFile.send(null);
            var text = "go go go ";
            return textFile;
        }
        value = setNewTexts();
4

3 回答 3

1
return textFile;

textFile没有定义。在其他任何地方,您都使用变量txtFile. 这里可能有错别字。这可能是你的问题。

于 2013-06-14T18:52:53.443 回答
0

如果您要在本地计算机上测试您的脚本(即运行脚本的 html 文件并且 textfile.txt 是本地的),那么您应该删除该if(txtFile.status === 200) { ... }检查,因为即使文件确实存在,在本地运行中也不总是如此。

和重点。由于您故意让您请求异步(通过传入) truetxtFile.open("GET", "textfile.txt", true);那么您应该更改您的函数,例如如下所示:

function setNewTexts(callback) {        {
    var txtFile = new XMLHttpRequest();
    txtFile.open("GET", "textfile.txt", true);
    txtFile.onreadystatechange = function() {
        if (txtFile.readyState === 4) {  // document is ready to parse.
            if (txtFile.status === 200) {  // file is found
                var lines = txtFile.responseText.split("\n");
                callback(lines);
            }
        }
    }
    txtFile.send(null);
}

以及您需要以下内容的其他地方textfile.txt

var value;
setNewTexts(function (lines) {
    value = lines;
});

关键是,由于您的请求是异步onreadystatechange处理程序,因此将在setNewTexts完成后执行,即您无法访问txtFile.responseText正确的处理程序,txtFile.send(null)因为那时没有任何响应。响应(即 的内容textfile.txt)只有在onreadystatechange被调用时才可用,readyState === 4并且只有在那一刻您才能将其保存到value变量中。

于 2013-06-14T20:22:21.687 回答
0

XMLHttpRequest 无法加载 file:///home/username/txtfile.txt。仅 HTTP 支持跨源请求。

这意味着出于安全原因,您的浏览器将不允许您从域外读取文件。在您的情况下,file:///您没有域。一些较旧的浏览器允许这样做,但那是网络的狂野西部。您需要在本地运行服务器才能执行您想要执行的操作。

于 2013-06-14T18:59:15.197 回答