当前位置: 首页 > 面试题库 >

用JavaScript打开本地文件

叶元凯
2023-03-14
问题内容

我是JavaScript新手。我找到了一个使用上的javascript打开本地文件的示例。进行一些谷歌搜索之后,我可以将Chrome设置为允许读取本地文件,然后可以运行该示例。但是,我想返回该字符串allText并在以后的脚本中使用它。但是绳子变成undefined外面了readTextFile()

还有一个类似的问题在这里。似乎与的异步功能有关AJAX。目前,我几乎无法理解这些术语。我只是不明白为什么在本文中将的第三个参数XMLHttpRequest.open()设置为true

无论如何,下面是我当前的代码。我想使用allText外部函数readTextFile()

<!DOCTYPE html>
<html>
    <script>
        function readTextFile(file)
        {   
            var allText;
            var rawFile = new XMLHttpRequest();
            rawFile.open("GET", file, false);
            rawFile.onreadystatechange = function ()
            {
                if(rawFile.readyState === 4)
                {
                    if(rawFile.status === 200 || rawFile.status == 0)
                    {
                        var allText = rawFile.responseText;
                        alert(allText);
                    }
                }
            }
            rawFile.send(null);
            return allText; // this is the part that goes wrong I think
        }

        t = readTextFile("foo.file");
        document.write(t) // print out "undeifned" instead of the correct answer

    </script>
</html>

问题答案:

实际上,这很可能是范围问题。由于您异步设置allText,因此函数返回后将无法立即使用它。另外,您将在函数中重新初始化allText,这无论如何都会影响返回范围。

rawFile.onreadystatechange函数返回后执行。您可以将执行移到XHR回调中,也可以将函数包装在promise中,这仍然需要您稍微修改控制流。

移动document.write

<!DOCTYPE html>
<html>
    <script>
        function readTextFile(file)
        {   
            var allText;
            var rawFile = new XMLHttpRequest();
            rawFile.open("GET", file);
            rawFile.onreadystatechange = function ()
            {
                if(rawFile.readyState === 4)
                {
                    if(rawFile.status === 200 || rawFile.status == 0)
                    {
                        allText = rawFile.responseText;
                        document.write(allText);
                    }
                }
            }
            rawFile.send(null);
        }

        readTextFile("foo.file");

    </script>
</html>

promise:

function readTextFile( file ) {
  return new Promise( function ( fulfill, reject ) {

    var allText;
    var rawFile = new XMLHttpRequest();
    rawFile.open( "GET", file );
    rawFile.onreadystatechange = function () {
      if ( rawFile.readyState === 4 ) {
        if ( rawFile.status === 200 || rawFile.status == 0 ) {
          fulfill( rawFile.responseText )
        }
      }
    }
    rawFile.send( null );
  } );
}
readTextFile( "foo.file" )
  .then( function ( t ) {
    document.write( t );
  } );

这两种方法都将确保您的脚本在XHR请求返回之前不会尝试使用allText。

尽管正如SantiagoHernández所指出的那样,XHR请求是同步的,范围问题的性质与我最初设想的不同。问题在于在函数中重新声明变量,导致返回的变量未定义。



 类似资料:
  • 本文向大家介绍Android 打开本地pdf文件,包括了Android 打开本地pdf文件的使用技巧和注意事项,需要的朋友参考一下 Android 中打开pdf文件也是一种很常见的场景,但是上网找了好多资料,有用WebView加载的,但是要用vpn才能搞,最后发现一个库挺不错的,再次分享给大家 android-pdfview。下面主要说一下该库的使用方法。 1. 该库的下载地址 https://g

  • 问题内容: 如何通过单击任何链接打开本地文件夹视图? 我尝试了很多选择 要么 要么 问题答案: 由于安全性限制,在所有现代浏览器中都禁止链接到本地​​资源。 对于Firefox: 为了安全起见,Mozilla应用程序阻止从远程文件到本地文件(和目录)的链接。这包括链接到硬盘驱动器,映射的网络驱动器上的文件,以及通过统一命名约定(UNC)路径访问的文件。这样可以避免许多不愉快的可能性,包括: 允许站

  • 问题内容: 我有一个将pdf文件作为ByteArrayOutputStream写入servlet的输出流的servlet。如果打开servlet URL,浏览器将打开文件。但是,如果在Servlet上发生错误,浏览器会打开一个带有错误消息的空白pdf。通过ServletResponse发送错误,浏览器将打开默认错误页面。 我要发送错误消息,而不重定向到错误页面或打开无效的pdf文件。 我试过了:

  • 我试图在javascript中打开一个json文件, 这不起作用,无法登录。json是一种东西,这就是它的本质: 任何帮助都很好,我需要使用Ajax吗?还是这是一个愚蠢的错误?我是javascript新手。

  • 我试图在本地计算机上使用swagger-ui打开我自己生成的swagger规范文件。 所以我下载了最新的标签V2.1.8-M1并提取了zip。然后进入子文件夹并将文件复制到其中。现在,我打开了,想要浏览。问题就从这里开始了: 如果我输入一个本地路径,它总是以包含的当前url作为前缀。因此我无法打开我的档案。我尝试了以下所有组合,但没有成功: null

  • 问题内容: 测试浏览器:Chrome版本:52.0.2743.116这是一个简单的JavaScript,可以从本地打开图像文件,例如“ C:\ 002.jpg” 请给我任何合适的建议。 问题答案: 知道这有点老了,但是看到很多这样的问题… 我们在课堂上经常使用Chrome,这是处理本地文件的必备条件。 我们一直在使用的是“ Chrome浏览器的Web服务器”。启动它,选择希望使用的文件夹,然后转到