如何在JavaScript中加载文本文件?

如何在JavaScript中加载文本文件?,javascript,model,load,webgl,Javascript,Model,Load,Webgl,我正在创建一个简单的WebGL项目,需要一种加载模型的方法。我决定使用OBJ格式,所以我需要一种方法来加载它。该文件(将要)存储在服务器上,我的问题是:JS中的一个如何加载到文本文件中,并逐行扫描它(就像C++中的streams一样)?我是JS新手,所以我的问题是。越简单越好 更新:broofa,我使用了你的解决方案,但我不确定我是否做对了。我从您编写的forEach循环中的一个文件加载数据,但在它之外(即,在所有代码之后),我一直填充数据的对象是“未定义的”。我做错了什么?代码如下: var

我正在创建一个简单的WebGL项目,需要一种加载模型的方法。我决定使用OBJ格式,所以我需要一种方法来加载它。该文件(将要)存储在服务器上,我的问题是:JS中的一个如何加载到文本文件中,并逐行扫描它(就像C++中的streams一样)?我是JS新手,所以我的问题是。越简单越好

更新:broofa,我使用了你的解决方案,但我不确定我是否做对了。我从您编写的forEach循环中的一个文件加载数据,但在它之外(即,在所有代码之后),我一直填充数据的对象是“未定义的”。我做错了什么?代码如下:

var materialFilename;

function loadOBJModel(filename)
{
    // ...

    var req = new XMLHttpRequest();
    req.open('GET', filename);
    req.responseType = 'text';
    req.onreadystatechange = function()
    {
        if (req.readyState == 4)
        {
            var lines = req.responseText.split(/\n/g);
            lines.forEach(function(line)
            {
                readLine(line);
            });
        }
    }
    req.send();

    alert(materialFilename);

    // ...
}

function readLine(line)
{
    // ...

    else if (tokens[0] == "mtllib")
    {
        materialFilename = tokens[1];
    }

    // ...
}

如果不能简单地用XHR或CORS加载数据,则可以使用JSON-p方法,方法是使用JavaScript函数包装数据,并将脚本标记动态附加到页面上

您将拥有一个服务器端脚本,该脚本将接受
回调
参数,并返回类似
回调1234(/*此处的文件数据*/)的内容

一旦您有了数据,解析应该是很简单的,但是您必须编写自己的解析函数。没有现成的文件。

您可以使用它来获取文件,假设它来自与主网页相同的域。如果没有,并且您可以控制托管您的文件的服务器,则可以轻松启用。例如

要逐行扫描,可以使用split()。像这样的事情

var req = new XMLHttpRequest();
req.open('GET', '/your/url/goes/here');
req.onreadystatechange = function() {
  if (req.readyState == 4) {
    if (req.status == 200) {
      var lines = req.responseText.split(/\n/g);
      lines.forEach(function(line, i) {
        // 'line' is a line of your file, 'i' is the line number (starting at 0)
      });
    } else {
      // (something went wrong with the request)
    }
  }
}

req.send();

这可能是一种选择,也可能不是,但你可以让自己做一些繁重的工作。它有多个加载程序选项可供利用。@Mookamafob我已经尝试过了,但由于缺乏实际文档,它对我来说无法使用。@broofa当然是现在添加的。问题是onreadystatechange是一个异步回调-直到当前事件循环完成后才会调用它(即,在您尝试提醒
materialFilename
的值之后。将提醒移到onreadystatechange函数的末尾,您应该可以开始了。另外,您启发我提出一个关于SO礼仪的小问题:)-@broofa我知道它是异步的,但我认为它无论如何都可能工作,因为我在
materialFilename=tokens[1];
后面放了警报,并且它总是被执行(使用正确的值)在
loadOBJModel
函数中出现警报之前。无论如何,
alert
只是为了调试原因,我需要
loadOBJModel
函数返回从文件中加载的数据,我该怎么做?“不知道为什么@Brad的答案被否决了。XHR/CORS可能是你想要的,正如他所指出的,你几乎完全靠自己的力量来完成。”如果这是您想要的,在令牌级别进行解析。如果您在google上搜索,您可能会找到用于生成JS解析器AST定义的实用程序,但这超出了此处的范围。我尝试过此解决方案,我添加了“console.log(req.responseText);”但我的浏览器(firefox)显示:只有“格式错误”(我不确定翻译,我有波兰语的brwoser)在开发者工具栏中。@NPS:在else块上缺少一个结尾“}”。修复代码-请重试。不,这是一个小错误,我甚至懒得提及。当然,我在运行代码之前修复了它。您的代码在删除“如果”之后开始为我工作(req.status==200)”(它可以获得其他一些代码,但它仍然可以工作)。我提到的警告在添加“req.responseType='text';”后消失了。谢谢您的帮助。我为我的问题添加了一个更新,如果您能回答我的问题,我将不胜感激。