JavaScript

JavaScript 知识量:26 - 101 - 483

23.2 进度事件><

load事件- 23.2.1 -

在Web开发中,XMLHttpRequest(XHR)是一个非常重要的工具,它允许浏览器与服务器进行通信,下载或上传数据。当使用XHR进行异步请求时,通常需要监听多个事件,如"readystatechange",然后根据状态码来判断请求是否完成。但是,这种方式可能会使代码变得复杂且难以维护。

为了简化这一过程,Firefox在实现XHR时引入了一个新的事件:load事件。当异步请求完成并且响应可用时,load事件被触发。这使得不再需要检查XHR实例的readyState属性,因为load事件处理程序会在请求完成后自动执行。

当load事件被触发时,它会接收一个事件对象作为参数,这个对象有一个target属性,该属性被设置为XHR实例。这意味着在load事件处理程序中,可以访问所有XHR对象的属性和方法,如responseText、status、responseXML等。

以下是一个使用load事件的简单示例:

var xhr = new XMLHttpRequest();  
xhr.open('GET', 'https://api.example.com/data', true);  
xhr.onload = function (event) {  
    if (event.target.status === 200) {  
        console.log(event.target.responseText);  
    } else {  
        console.error('Request failed');  
    }  
};  
xhr.send();

在这个示例中,当load事件被触发时,它会检查XHR实例的状态码是否为200(表示成功)。如果是,则打印响应文本;否则,打印一个错误消息。

总的来说,load事件提供了一种更简洁、更直观的方式来处理XHR请求的完成和响应的可用性。

progress事件- 23.2.2 -

progress事件是Mozilla在XHR对象上引入的另一个重要特性,用于在浏览器接收数据期间反复触发。这是一个非常有用的特性,因为它允许在数据传输过程中实时监控和跟踪请求的进度。

当progress事件被触发时,它会传递一个事件对象给处理程序。这个事件对象包含一些有用的属性,最关键的是target属性,它被设置为XHR实例。除了target属性,progress事件还提供了其他三个额外的属性:

  • lengthComputable:这是一个布尔值,表示是否可以计算总的传输大小。如果可以,那么它通常是在请求开始时通过HTTP响应头中的Content-Length字段得知的。如果不能计算,那么可能是由于响应类型是流或者没有提供Content-Length头信息。

  • position:表示当前已经接收到的数据的字节数。这是一个非常重要的属性,因为它允许跟踪请求的进度。

  • totalSize:表示总的字节传输量。这通常是在请求开始时通过HTTP响应头中的Content-Length字段得知的。如果响应类型是流或者没有提供Content-Length头信息,那么这个属性可能无法使用。

使用这些属性,可以构建出一些有用的功能,比如显示一个下载进度条,或者在数据传输过程中进行一些其他的处理。

以下是一个简单的示例:

var xhr = new XMLHttpRequest();  
xhr.open('GET', 'https://api.example.com/data', true);  
xhr.onprogress = function (event) {  
    if (event.lengthComputable) {  
        var percentComplete = (event.position / event.totalSize) * 100;  
        console.log('Progress: ' + percentComplete + '%');  
    } else {  
        console.log('Progress cannot be calculated');  
    }  
};  
xhr.send();

在这个示例中,在每次progress事件触发时计算并打印出进度百分比。如果无法计算进度(例如,响应类型是流或者没有提供Content-Length头信息),那么将打印出一条错误消息。