m0_67644151 2023-02-05 18:08 采纳率: 71.4%
浏览 40
已结题

html如何等待文件传入后再执行js代码

问题遇到的现象和发生背景

我需要在一个页面内插入一个文件,并用js代码处理这个文件,由于代码必须要浏览器才能处理。
尝试用sleep()函数,但会导致等待对应时长后才加载页面,而不是加载页面完成后等待对应时长再执行sleep()之后的代码。
现在它一直报错

Uncaught TypeError: Cannot set properties of null (setting 'onchange')

全代码:

<html>
<meta charset="utf-8">
<title>TEMP PAGE</title>
<head>
    <style>
        h1 {font-size: 36px;}
        p {font-size: 25px;}
        h2 {font-size: 14px;}
        p.sansserif {font-family: "Microsoft YaHei";}
    </style>
</head>
<body>
    <p class="sansserif">首先,请点击下方按钮,并选择打开.exe显示的文件。</p>
    <input name="file" id="input" type="file">
    <button id="button">保存长度信息</button>
</body>
<script>
    /* 创建一些数组 */
    window.addEventListener('load', function () {
        var text = new Array();
        var width = new Array();
        var height = new Array();
        function sleep(d) {
            for (var t = Date.now(); Date.now() - t <= d;);
        }

        sleep(10000);

        document.getElementById('file').onchange = function () {
            var file = this.files[0];
            var reader = new FileReader();
            reader.onload = function (progressEvent) {
                var fileContentArray = this.result.split(/\r\n|\n/);
                var line = lines[0];
                console.log(lines[0]);
                for (var line = 0; line < lines.length - 1; line++) {
                    console.log(line + " --> " + lines[line]);
                }
            };
            reader.readAsText(file);
        };
    });
    /*for (i = 0; i < line; i++) {
        let spanDom = document.createElement("span");
        spanDom.style.fontSize = "25";
        spanDom.style.opacity = "0";
        spanDom.innerHTML = "Hello World!";
        spanDom.style.fontFamily = "Microsoft YaHei";
        document.body.append(spanDom);
        let size = {};
        size = spanDom.getBoundingClientRect();
        spanDom.remove();
        console.log(size);
        console.log(size.height);
        console.log(size.width);
    }*/
</script>
</html>

另外,可以通过c++程序向浏览器的js传入信息吗?是chrome浏览器。
处理完后能直接保存到对应位置吗?还是必须通过下载文件的方式?

  • 写回答

3条回答 默认 最新

  • Eliot5566 2023-02-05 18:55
    关注

    答案引用CHATGPT 如果有帮助请点个采纳
    如果想等待文件传入后再执行 JavaScript 代码,可以使用如下代码:

    <input name="file" id="input" type="file">
    <button id="button">保存长度信息</button>
    
    <script>
      document.getElementById('input').addEventListener('change', function () {
        var file = this.files[0];
        var reader = new FileReader();
        reader.onload = function (progressEvent) {
          // 这里是文件加载完成后执行的代码
          // 读取文件内容并处理
          var fileContentArray = this.result.split(/\r\n|\n/);
          console.log(fileContentArray);
          // ...
        };
        reader.readAsText(file);
      });
    </script>
    
    
    

    因为使用 FileReader 的读取是异步的,所以必须等到文件读取完成后再执行其他操作。

    关于第二个问题,Chrome 浏览器限制了在网页中直接操作本地文件,如果想要处理完后直接保存到对应位置,可以通过将文件以数据的形式传递到后台程序处理,然后再从后台程序保存到本地。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月13日
  • 已采纳回答 2月5日
  • 创建了问题 2月5日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么