深入理解ajax系列第五篇——進度事件

前面的話

  一般地,使用readystatechange事件探測HTTP請求的完成。XHR2規范草案定義了進度事件Progress Events規范,XMLHttpRequest對象在請求的不同階段觸發不同類型的事件,所以它不再需要檢査readyState屬性。這個草案定義了與客戶端服務器通信有關的事件。這些事件最早其實只針對XHR操作,但目前也被其他API(如File API)借鑒。本文將詳細介紹進度事件

?

基礎

  有以下6個進度事件

  loadstart:在接收到響應數據的第一個字節時觸發

  progress:在接收響應期間持續不斷地觸

  error:在請求發生錯誤時觸發

  abort:在因為調用abort()方法而終止連接時觸發

  load:在接收到完整的響應數據時觸發

  loadend:在通信完成或者觸發error、abort或load事件后觸發

  timeout:超時發生時觸發

  [注意]IE9-瀏覽器不支持以上事件(IE9瀏覽器僅支持load事件)

  每個請求都從觸發loadstart事件開始,接下來,通常每隔50毫秒左右觸發一次progress事件,然后觸發load、error、abort或timeout事件中的一個,最后以觸發loadend事件結束

  對于任何具體請求,瀏覽器將只會觸發load、abort、timeout和error事件中的一個。XHR2規范草案指出一旦這些事件中的一個發生后,瀏覽器應該觸發loadend事件

?

load

  響應接收完畢后將觸發load事件,因此也就沒有必要去檢查readyState屬性了。但一個完成的請求不一定是成功的請求,例如,load事件的處理程序應該檢查XMLHttpRequest對象的status狀態碼來確定收到的是“200 OK”而不是“404 Not Found”的HTTP響應

復制代碼
<button id="btn">獲取信息</button>
<div id="result"></div>
<script>
btn.onclick = function(){//創建xhr對象var xhr;if(window.XMLHttpRequest){xhr = new XMLHttpRequest();}else{xhr = new ActiveXObject('Microsoft.XMLHTTP');}//進度事件xhr.onload = function(){if(xhr.status == 200){result.innerHTML += xhr.responseText;}}//發送請求xhr.open('get','message.xml',true);xhr.send();
}
</script>        
復制代碼

progress

  progress事件會在瀏覽器接收新數據期間周期性地觸發。而onprogress事件處理程序會接收到一個event對象,其target屬性是XHR對象,但包含著三個額外的屬性:lengthComputable、loaded和total。其中,lengthComputable是一個表示進度信息是否可用的布爾值,loaded表示已經接收的字節數,total表示根據Content-Length響應頭部確定的預期字節數。有了這些信息,就可以為用戶創建一個進度指示器了

復制代碼
<button id="btn">獲取信息</button>
<div id="result"></div>
<div id="music"></div>
<script>
btn.onclick = function(){//創建xhr對象var xhr;if(window.XMLHttpRequest){xhr = new XMLHttpRequest();}else{xhr = new ActiveXObject('Microsoft.XMLHTTP');}//進度事件xhr.onprogress = function(e){e = e || event;if (e.lengthComputable){result.innerHTML = "Received " + e.loaded + " of " + e.total + " bytes";}};xhr.onload = function(e){var data = xhr.response;e = e || event;if(xhr.status == 200){var audio = document.createElement('audio');audio.onload = function(){URL.revokeObjectURL(audio.src);}audio.src = URL.createObjectURL(data);console.log(audio);audio.setAttribute('controls','');if(!music.innerHTML){music.appendChild(audio);}}};//發送請求xhr.open('get','myocean.mp3',true);xhr.responseType = 'blob';xhr.send();
}
</script>    
復制代碼

上傳進度

  除了為監控HTTP響應的加載定義的這些有用的事件外,XHR2也給出了用于監控HTTP請求上傳的事件。在實現這些特性的瀏覽器中,XMLHttpRequest對象將有upload屬性。upload屬性值是一個對象,它定義了addEventListener()方法和整個progress事件集合,比如onprogress和onload(但upload對象沒有定義onreadystatechange屬性,upload僅能觸發新的事件類型)

  能僅僅像使用常見的progress事件處理程序一樣使用upload事件處理程序。對于XMLHttpRequest對象,設置XHR.onprogress以監控響應的下載進度,并且設置XHR.upload.onprogress以監控請求的上傳進度

復制代碼
<input type="file" name="file1" id="file1" style="display:none">
<button id="btn">上傳文件</button>
<div id="pro"></div>
<div id="result"></div>
<script>
btn.onclick = function(){file1.click();pro.innerHTML = result.innerHTML = '';
}
file1.onchange = function(){//創建xhr對象var xhr;if(window.XMLHttpRequest){xhr = new XMLHttpRequest();}else{xhr = new ActiveXObject('Microsoft.XMLHTTP');}var data = file1.files[0];//上傳事件xhr.upload.onprogress = function(e){e = e || event;if (e.lengthComputable){pro.innerHTML = "上傳進度為:" + e.loaded + " of " + e.total + " bytes" + ';百分比為:' + e.loaded/e.total;}}xhr.onload = function(e){var data = xhr.responseText;e = e || event;if(xhr.status == 200){result.innerHTML =  data;}};//發送請求xhr.open('post','pp.php',true);xhr.setRequestHeader("content-type",data.type);xhr.send(data);
}
</script>      
復制代碼
復制代碼
<?php
error_reporting(E_ALL & ~E_NOTICE);
touch($file);
if(preg_match('/image/',apache_request_headers()['content-type'])){$file = 'photo/test.jpg'; binary_to_file($file);echo '文件上傳成功!';
}else{echo '文件格式不正確,請選擇圖片文件';
}
function binary_to_file($file){$content = $GLOBALS['HTTP_RAW_POST_DATA'];  // 需要php.ini設置if(empty($content)){$content = file_get_contents('php://input'); //不需要php.ini設置,內存壓力小}$ret = file_put_contents($file, $content, true);return $ret;
};
?>
復制代碼

?

其他事件

  HTTP請求無法完成有3種情況,對應3種事件。如果請求超時,會觸發timeout事件。如果請求中止,會觸發abort事件。最后,像太多重定向這樣的網絡錯誤會阻止請求完成,但這些情況發生時會觸發error事件

  可以通過調用XMLHttpRequest對象的abort()方法來取消正在進行的HTTP請求。調用abort()方法在這個對象上觸發abort事件

  調用abort()的主要原因是完成取消或超時請求消耗的時間太長或當響應變得無關時。假如使用XMLHttpRequest為文本輸入域請求自動完成推薦。如果用戶在服務器的建議達到之前輸入了新字符,這時等待請求不再有用,應該中止

  XHR對象的timeout屬性等于一個整數,表示多少毫秒后,如果請求仍然沒有得到結果,就會自動終止。該屬性默認等于0,表示沒有時間限制

  如果請求超時,將觸發ontimeout事件

復制代碼
var xhr = new XMLHttpRequest();
btn.onclick = function(){xhr.abort();
};
xhr.ontimeout = function(){console.log('The request timed out.');
}
xhr.timeout = 100;
xhr.onabort = function(){console.log("The transfer has been canceled by the user.");
}
xhr.onerror = function(){console.log("An error occurred while transferring the file.");    
}
xhr.onloadend = function(){console.log("請求結束");    
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282566.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282566.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282566.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對象(poco)深度克隆

提供深度克隆對象功能,基于編譯表達式實現&#xff0c;性能與原生代碼幾無差別&#xff0c;遠超 json/binary 序列化實現。1. 簡單示例class Person {public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public DateTime Birth { get; s…

php將數字轉化為中文大寫人民幣格式

<?phpfunction cny($ns) {static $cnums array("零","壹","貳","叁","肆","伍","陸","柒","捌","玖"),$cnyunits array("圓","角","分&…

BZOJ1787 [Ahoi2008]Meet 緊急集合 LCA

歡迎訪問~原文出處——博客園-zhouzhendong 去博客園看該題解 題目傳送門 - BZOJ1787 題意概括 有一棵節點為n個(n≤500000)的樹。接下來m次詢問(m≤500000)&#xff0c;每次給出3個點 a,b,c &#xff0c;現在讓你求一個點 p &#xff0c;使得 dis(p,a) dis(p,b) dis(p,c) 最…

Linux之ACL權限控制

ACL權限控制主要目的是提供傳統的owner,group,other的read,wirte,execute權限之外的具體權限設置&#xff0c;可以針對單一用戶或組來設置特定的權限 設置ACL權限&#xff1a;setfacl查看ACL權限&#xff1a;getfacl 比如&#xff1a;某一目錄權限為 drwx------ 2 root root 40…

WIX、Squarespace、WordPress 三者的優劣分別是什么?

層出不窮的智能建站&#xff0c;模板建站&#xff0c;源碼建站&#xff0c;云建站&#xff0c;仿站&#xff0c;各種建站概念都拋灑于紅海之中。到底什么樣的網站適合自己&#xff0c;什么樣的網站值得我們去消費&#xff0c;什么樣的網站能長久&#xff0c;是個非常值得思考的…

平滑的加權輪詢均衡算法

前言在反向代理、路由、分布式應用調度等場景中通常都需要用到負載均衡算法&#xff0c;負載均衡的關鍵要點是“均衡”&#xff0c;即確保調用請求能均衡地落到多個處理節點上&#xff0c;負載均衡算法一般使用隨機或輪詢都可以保證均衡性。現實中由于服務器性能或資源分配的差…

php類精確驗證身份證號碼

<?php class check_IdCard {// $num為身份證號碼&#xff0c;$checkSex&#xff1a;1為男&#xff0c;2為女&#xff0c;不輸入為不驗證public function checkIdentity($num, $checkSex ) { // 不是15位或不是18位都是無效身份證號if (strlen($num) ! 15 && strl…

請說說接口和抽象類的區別?

1.從使用目的來看&#xff1a; 接口只是一個類間的協議&#xff0c;它并沒有規定怎么去實現&#xff1b; 抽象類可以重用你代碼使你的代碼更加簡潔&#xff1b;2.從行為來看&#xff1a; 接口可以多繼承,multi-implement 抽象類不能實例化&#xff0c;必須子類化才能實例化…

GitHub 使用

Git 是由 Linux 之父 Linus Tovalds 為了更好的管理 linux 內核開發而創立的分布是版本控制/軟件管理配置軟件. 簡單來說, Git 管理你的 代碼的歷史記錄 的工具. 首先注冊賬戶 (已經完成, moveofgod) 然后, 下載一個 GitHub Desktop(mac), msisgit 客戶端 (可以用命令行實現, …

LinkedHashMap 與 HashMap區別

2019獨角獸企業重金招聘Python工程師標準>>> LinkedHashMap 與 HashMap區別 &#xff08;非原創&#xff09; HashMap,LinkedHashMap,TreeMap都屬于Map Map 主要用于存儲鍵(key)值(value)對&#xff0c;根據鍵得到值&#xff0c;因此鍵不允許鍵重復,但允許值重復。 …

C# 11 中的 file local type

C# 11 中的 file local typeIntro在之前的版本中&#xff0c;我們想要一個類型只在當前的類型中生效&#xff0c;通常我們會在一個類的內部聲明一個 private 的類型以此來控制這個類型的訪問權限&#xff0c;在 C# 11 中引入了一個 file local type&#xff0c;僅在聲明類型的這…

PHP實現類似百度搜索自動完成(代碼簡單)

一、效果圖: 二、HTML代碼 <html lang"en"> <head><meta charset"utf-8"><title>jQuery UI 自動完成&#xff08;Autocomplete&#xff09; - 默認功能</title><link rel"stylesheet" href"/public/Auto…

Mysql讀寫分離php腳本

<?php/*php如何連接mysql*/ /*$link mysql_connect(‘localhost‘, ‘root‘, ‘‘);if (!$link) {die(‘Could not connect: ‘ . mysql_error());}echo ‘Connected successfully‘;mysql_close($link);*/ /*php如何選擇數據庫*//*$link mysql_connect(‘localhost‘, …

CentOS 搭建Postfix+Dovecot簡單郵件系統

2019獨角獸企業重金招聘Python工程師標準>>> 服務器信息 系統&#xff1a;CentOS 6.5 minimal版本 主機&#xff1a;虛擬機 虛擬機IP&#xff1a;192.168.128.128/24 宿主IP:10.1.79.24/24 安裝postfix 注意&#xff1a;CentOS 7實際上已經用postfixSasl2代替sendma…

Js獲取當前頁面URL各種參數

JS獲取當前頁面URL各種參數 一&#xff1a;Location Location 對象包含有關當前 URL 的信息。 Location 對象是 Window 對象的一個部分&#xff0c;可通過 window.location 屬性來訪問。 hash設置或返回從井號 (#) 開始的 URL&#xff08;錨&#xff09;。host設置或返回主機名…

php面試題2018

一 、PHP基礎部分 1、PHP語言的一大優勢是跨平臺&#xff0c;什么是跨平臺&#xff1f; PHP的運行環境最優搭配為ApacheMySQLPHP&#xff0c;此運行環境可以在不同操作系統&#xff08;例如windows、Linux等&#xff09;上配置&#xff0c;不受操作系統的限制&#xff0c;所以…

學生黨的專屬定制福利,你想要的這里全都有!

同學們&#xff1a;您好&#xff01;很?興認識?家&#xff01;我是微軟的 Regional Cloud Advocate Kinfey Lo&#xff0c;感謝您在課余時間打開這封信。踏??秋&#xff0c;技術峰會進?了旺季&#xff0c;有?向商業的&#xff0c;有?向開發者的&#xff0c;有?向技術社…

Quartus prime16.0 與modelsim ae 聯調

前言 quartus和modelsim聯調對仿真還是很方便的&#xff0c;當然最好是quartus干綜合到燒錄的活&#xff0c;modelsim單獨仿真。而且ae版的性能比se版差。 流程&#xff1a; 1.配置modelsim ae路徑&#xff1a; 我這里是這個路徑&#xff0c;根據你自己安裝的地方配置路徑。 2.…

30分鐘搞定后臺登錄界面(103個后臺PSD源文件、素材網站)

去年八月時要做一個OA系統為了后臺界面而煩惱&#xff0c;后來寫了一篇博客&#xff08;《后臺管理UI的選擇》&#xff09;介紹了選擇過程與常用后臺UI&#xff0c;令我想不到的時竟然有許多開發者與我一樣都為這個事情而花費不少時間&#xff0c;最后界面效果還是不佳&#xf…

分析拼多多的崛起【產品思維】

最近朋友圈討論拼多多上市的新聞大火&#xff0c;各有各的看法&#xff0c;很有意思&#xff0c;突然想起前段時間得到上的《梁寧-產品思維30講》&#xff0c;所以想從數據和產品角度分析分析拼多多的崛起。 一&#xff1a;拼多多的迅速崛起 我們先看看拼多多這幾年的成長歷程&…