【问题标题】:How can I get the progress of a downloading <script>?如何获取下载 <script> 的进度?
【发布时间】:2013-08-08 12:45:44
【问题描述】:

假设,例如,我正在创建一个游戏。我有一个小脚本,其工作是加载所有资产并在加载资产时向用户显示进度条。

其中一个资产是包含游戏逻辑的相当大的脚本。可能超过 3 MB。

如何向用户显示第二个脚本的加载进度?

【问题讨论】:

  • 密切相关:requirejs load script progress("RequrieJs 通过在 DOM 中创建新的脚本标签来加载模块并监听 load 事件。在开始和结束加载之间没有更新事件.")
  • 那是浏览器的事情,不是我们程序员能控制的。只有当浏览器完成加载和“编译”JS文件时,你才能访问它,所以我能看到的唯一方法是使用几个较小的文件并在它们之间拆分逻辑。

标签: javascript html


【解决方案1】:

&lt;script&gt; 标签只触发 loaderror 事件;他们不会触发progress 事件。但是,在现代浏览器中,Ajax requests do support progress events。您可以通过 Ajax 加载脚本内容并监控进度,然后在加载完成时将脚本内容放入新的 &lt;script&gt; 元素中:

var req = new XMLHttpRequest();

// report progress events
req.addEventListener("progress", function(event) {
    if (event.lengthComputable) {
        var percentComplete = event.loaded / event.total;
        // ...
    } else {
        // Unable to compute progress information since the total size is unknown
    }
}, false);

// load responseText into a new script element
req.addEventListener("load", function(event) {
    var e = event.target;
    var s = document.createElement("script");
    s.innerHTML = e.responseText;
    // or: s[s.innerText!=undefined?"innerText":"textContent"] = e.responseText
    document.documentElement.appendChild(s);

    s.addEventListener("load", function() {
        // this runs after the new script has been executed...
    });
}, false);

req.open("GET", "foo.js");
req.send();

对于不支持 Ajax progress 的旧版浏览器,您可以构建进度报告 UI,使其仅在第一个 progress 事件之后显示加载栏(否则,如果没有 progress,则显示通用微调器事件发生过)。

【讨论】:

  • 感谢您的代码。但是如果脚本是针对第三方库的呢?
【解决方案2】:

你可能想看看How to show loading status in percentage for ajax response?

查看AJAX下载的状态。由于您正在加载脚本,因此它可能不是获取文件的最佳方式,但它可以工作。然后,您需要将 ajax 调用收到的内容放在某处执行,不建议使用 eval。

【讨论】:

  • 这似乎是eval 可接受的用例。你有什么不推荐它的实际理由,还是你只是盲目地这么说?
  • eval 是为做这样的事情而生的。唯一不建议使用eval 的情况是在不需要它的情况下,或者这是一个很大的安全风险。这可能是安全风险的唯一方法是中间人攻击或受损服务器 - 两者都比eval提供更大的风险。
  • 我总是被告知不要使用 eval 除非你真的需要......所以你可能是对的。也许也可以进行脚本标签注入,就像 requireJS 一样,他们必须有不使用 eval 的理由?
  • 是的,这是一个完全可以接受的 eval 用例。任何地方都没有用户输入-只有您可以信任的程序员输入:) ...除非您不信任自己:p
猜你喜欢
  • 2011-07-26
  • 2014-04-11
  • 2020-10-14
  • 2013-10-09
  • 1970-01-01
  • 2023-04-02
  • 2018-10-05
  • 2018-10-31
  • 2014-01-13
相关资源
最近更新 更多