XMLHttpRequestEventTarget:progress 事件

注意:此功能在 Web Workers 中可用,但 Service Workers 除外。

当请求接收到更多数据时,会定期触发 progress 事件。

语法

在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。

js
addEventListener("progress", (event) => { })

onprogress = (event) => { }

事件类型

一个 ProgressEvent。继承自 Event

Event ProgressEvent

事件属性

除了下面列出的属性之外,父接口 Event 的属性也可使用。

lengthComputable 只读

一个布尔值,指示底层进程的待完成总工作量以及已完成工作量的可计算性。换句话说,它告知进度是否可衡量。

loaded 只读

一个 64 位无符号整数值,表示底层进程已完成的工作量。通过将此属性的值除以 total,可以计算出已完成工作的比例。使用 HTTP 下载资源时,此值仅包含 HTTP 消息的正文,不包括标头和其他开销。

total 只读

一个 64 位无符号整数,表示底层进程正在执行的总工作量。使用 HTTP 下载资源时,这对应于 Content-Length(消息正文的大小),不包括标头和其他开销。

示例

与 XMLHttpRequest 的用法

HTML

html
<div class="controls">
  <input
    class="xhr success"
    type="button"
    name="xhr"
    value="Click to start XHR (success)" />
  <input
    class="xhr error"
    type="button"
    name="xhr"
    value="Click to start XHR (error)" />
  <input
    class="xhr abort"
    type="button"
    name="xhr"
    value="Click to start XHR (abort)" />
</div>

<textarea readonly class="event-log"></textarea>

JavaScript

js
const xhrButtonSuccess = document.querySelector(".xhr.success");
const xhrButtonError = document.querySelector(".xhr.error");
const xhrButtonAbort = document.querySelector(".xhr.abort");
const log = document.querySelector(".event-log");

function handleEvent(e) {
  log.textContent = `${log.textContent}${e.type}: ${e.loaded} bytes transferred\n`;
}

function addListeners(xhr) {
  xhr.addEventListener("loadstart", handleEvent);
  xhr.addEventListener("load", handleEvent);
  xhr.addEventListener("loadend", handleEvent);
  xhr.addEventListener("progress", handleEvent);
  xhr.addEventListener("error", handleEvent);
  xhr.addEventListener("abort", handleEvent);
}

function runXHR(url) {
  log.textContent = "";

  const xhr = new XMLHttpRequest();
  addListeners(xhr);
  xhr.open("GET", url);
  xhr.send();
  return xhr;
}

xhrButtonSuccess.addEventListener("click", () => {
  runXHR(
    "https://raw.githubusercontent.com/mdn/content/main/files/en-us/_wikihistory.json",
  );
});

xhrButtonError.addEventListener("click", () => {
  runXHR("http://i-dont-exist");
});

xhrButtonAbort.addEventListener("click", () => {
  runXHR(
    "https://raw.githubusercontent.com/mdn/content/main/files/en-us/_wikihistory.json",
  ).abort();
});

结果

与 XMLHttpRequestUpload 的用法

您可以使用 progress 事件来获取有关长时间运行上传进度的信息。有关上传文件并显示进度条的完整代码示例,请参阅 XMLHttpRequestUpload 主页。

js
// Each time a progress event is received we update the progress bar
// and the progress message
xhr.upload.addEventListener("progress", (event) => {
  progressBar.value = event.loaded; // Update the progress bar
  log.textContent = `Uploading (${((event.loaded / event.total) * 100).toFixed(
    2,
  )}%)…`;
});

规范

规范
XMLHttpRequest
# event-xhr-progress
XMLHttpRequest
# handler-xhr-onprogress

浏览器兼容性

api.XMLHttpRequest.progress_event

api.XMLHttpRequestUpload.progress_event

另见