XMLHttpRequest鏄竴涓祻瑙堝櫒鎺ュ彛錛屼嬌寰桱avascript鍙互榪涜HTTP(S)閫氫俊銆?/p>
鏈鏃╋紝寰蔣鍦↖E 5寮曡繘浜嗚繖涓帴鍙c傚洜涓哄畠澶湁鐢紝鍏朵粬嫻忚鍣ㄤ篃妯′豢閮ㄧ講浜嗭紝ajax鎿嶄綔鍥犳寰椾互璇炵敓銆?/p>
浣嗘槸錛岃繖涓帴鍙d竴鐩存病鏈夋爣鍑嗗寲錛屾瘡瀹舵祻瑙堝櫒鐨勫疄鐜版垨澶氭垨灝戞湁鐐逛笉鍚屻侶TML 5鐨勬蹇靛艦鎴愬悗錛學3C寮濮嬭冭檻鏍囧噯鍖栬繖涓帴鍙c?008騫?鏈堬紝灝辨彁鍑轟簡XMLHttpRequest Level 2 鑽夋銆?/p>
榪欎釜XMLHttpRequest鐨勬柊鐗堟湰錛屾彁鍑轟簡寰堝鏈夌敤鐨勬柊鍔熻兘錛屽皢澶уぇ鎺ㄥ姩浜掕仈緗戦潻鏂般傛湰鏂囧氨瀵硅繖涓柊鐗堟湰榪涜璇︾粏浠嬬粛銆?/p>
涓銆佽佺増鏈殑XMLHttpRequest瀵硅薄
鍦ㄤ粙緇嶆柊鐗堟湰涔嬪墠錛屾垜浠厛鍥為【涓涓嬭佺増鏈殑鐢ㄦ硶銆?/p>
棣栧厛錛屾柊寤轟竴涓猉MLHttpRequest鐨勫疄渚嬨?/p>
銆銆var xhr = new XMLHttpRequest();
鐒跺悗錛屽悜榪滅▼涓繪満鍙戝嚭涓涓狧TTP璇鋒眰銆?/p>
銆銆xhr.open('GET', 'example.php');
銆銆xhr.send();
鎺ョ潃錛屽氨絳夊緟榪滅▼涓繪満鍋氬嚭鍥炲簲銆傝繖鏃墮渶瑕佺洃鎺MLHttpRequest瀵硅薄鐨勭姸鎬佸彉鍖栵紝鎸囧畾鍥炶皟鍑芥暟銆?/p>
銆銆xhr.onreadystatechange = function(){
銆銆銆銆if ( xhr.readyState == 4 && xhr.status == 200 ) {
銆銆銆銆銆銆alert( xhr.responseText );
銆銆銆銆} else {
銆銆銆銆銆銆alert( xhr.statusText );
銆銆銆銆}
銆銆};
涓婇潰鐨勪唬鐮佸寘鍚簡鑰佺増鏈琗MLHttpRequest瀵硅薄鐨勪富瑕佸睘鎬э細
銆銆* xhr.readyState錛歑MLHttpRequest瀵硅薄鐨勭姸鎬侊紝絳変簬4琛ㄧず鏁版嵁宸茬粡鎺ユ敹瀹屾瘯銆?/p>
銆銆* xhr.status錛氭湇鍔″櫒榪斿洖鐨勭姸鎬佺爜錛岀瓑浜?00琛ㄧず涓鍒囨甯搞?/p>
銆銆* xhr.responseText錛氭湇鍔″櫒榪斿洖鐨勬枃鏈暟鎹?/p>
銆銆* xhr.responseXML錛氭湇鍔″櫒榪斿洖鐨刋ML鏍煎紡鐨勬暟鎹?/p>
銆銆* xhr.statusText錛氭湇鍔″櫒榪斿洖鐨勭姸鎬佹枃鏈?/p>
浜屻佽佺増鏈殑緙虹偣
鑰佺増鏈殑XMLHttpRequest瀵硅薄鏈変互涓嬪嚑涓己鐐癸細
銆銆* 鍙敮鎸佹枃鏈暟鎹殑浼犻侊紝鏃犳硶鐢ㄦ潵璇誨彇鍜屼笂浼犱簩榪涘埗鏂囦歡銆?/p>
銆銆* 浼犻佸拰鎺ユ敹鏁版嵁鏃訛紝娌℃湁榪涘害淇℃伅錛屽彧鑳芥彁紺烘湁娌℃湁瀹屾垚銆?/p>
銆銆* 鍙楀埌"鍚屽煙闄愬埗"錛圫ame Origin Policy錛夛紝鍙兘鍚戝悓涓鍩熷悕鐨勬湇鍔″櫒璇鋒眰鏁版嵁銆?/p>
涓夈佹柊鐗堟湰鐨勫姛鑳?/span>
鏂扮増鏈殑XMLHttpRequest瀵硅薄錛岄拡瀵硅佺増鏈殑緙虹偣錛屽仛鍑轟簡澶у箙鏀硅繘銆?/p>
銆銆* 鍙互璁劇疆HTTP璇鋒眰鐨勬椂闄愩?/p>
銆銆* 鍙互浣跨敤FormData瀵硅薄綆$悊琛ㄥ崟鏁版嵁銆?/p>
銆銆* 鍙互涓婁紶鏂囦歡銆?/p>
銆銆* 鍙互璇鋒眰涓嶅悓鍩熷悕涓嬬殑鏁版嵁錛堣法鍩熻姹傦級銆?/p>
銆銆* 鍙互鑾峰彇鏈嶅姟鍣ㄧ鐨勪簩榪涘埗鏁版嵁銆?/p>
銆銆* 鍙互鑾峰緱鏁版嵁浼犺緭鐨勮繘搴︿俊鎭?/p>
涓嬮潰錛屾垜灝變竴涓浠嬬粛榪欎簺鏂板姛鑳姐?/p>
鍥涖丠TTP璇鋒眰鐨勬椂闄?/span>
鏈夋椂錛宎jax鎿嶄綔寰堣楁椂錛岃屼笖鏃犳硶棰勭煡瑕佽姳澶氬皯鏃墮棿銆傚鏋滅綉閫熷緢鎱紝鐢ㄦ埛鍙兘瑕佺瓑寰堜箙銆?/p>
鏂扮増鏈殑XMLHttpRequest瀵硅薄錛屽鍔犱簡timeout灞炴э紝鍙互璁劇疆HTTP璇鋒眰鐨勬椂闄愩?/p>
銆銆xhr.timeout = 3000;
涓婇潰鐨勮鍙ワ紝灝嗘渶闀跨瓑寰呮椂闂磋涓?000姣銆傝繃浜嗚繖涓椂闄愶紝灝辮嚜鍔ㄥ仠姝TTP璇鋒眰銆備笌涔嬮厤濂楃殑榪樻湁涓涓猼imeout浜嬩歡錛岀敤鏉ユ寚瀹氬洖璋冨嚱鏁般?/p>
銆銆xhr.ontimeout = function(event){
銆銆銆銆alert('璇鋒眰瓚呮椂錛?);
銆銆}
鐩墠錛孫pera銆丗irefox鍜孖E 10鏀寔璇ュ睘鎬э紝IE 8鍜孖E 9鐨勮繖涓睘鎬у睘浜嶺DomainRequest瀵硅薄錛岃孋hrome鍜孲afari榪樹笉鏀寔銆?/p>
浜斻丗ormData瀵硅薄
ajax鎿嶄綔寰寰鐢ㄦ潵浼犻掕〃鍗曟暟鎹備負浜嗘柟渚胯〃鍗曞鐞嗭紝HTML 5鏂板浜嗕竴涓狥ormData瀵硅薄錛屽彲浠ユā鎷熻〃鍗曘?/p>
棣栧厛錛屾柊寤轟竴涓狥ormData瀵硅薄銆?/p>
銆銆var formData = new FormData();
鐒跺悗錛屼負瀹冩坊鍔犺〃鍗曢」銆?/p>
銆銆formData.append('username', '寮犱笁');
銆銆formData.append('id', 123456);
鏈鍚庯紝鐩存帴浼犻佽繖涓狥ormData瀵硅薄銆傝繖涓庢彁浜ょ綉欏佃〃鍗曠殑鏁堟灉錛屽畬鍏ㄤ竴鏍楓?/p>
銆銆xhr.send(formData);
FormData瀵硅薄涔熷彲浠ョ敤鏉ヨ幏鍙栫綉欏佃〃鍗曠殑鍊箋?/p>
銆銆var form = document.getElementById('myform');
銆銆var formData = new FormData(form);
銆銆formData.append('secret', '123456'); // 娣誨姞涓涓〃鍗曢」
銆銆xhr.open('POST', form.action);
銆銆xhr.send(formData);
鍏佷笂浼犳枃浠?/span>
鏂扮増XMLHttpRequest瀵硅薄錛屼笉浠呭彲浠ュ彂閫佹枃鏈俊鎭紝榪樺彲浠ヤ笂浼犳枃浠躲?/p>
鍋囧畾files鏄竴涓?閫夋嫨鏂囦歡"鐨勮〃鍗曞厓绱狅紙input[type="file"]錛夛紝鎴戜滑灝嗗畠瑁呭叆FormData瀵硅薄銆?/p>
銆銆var formData = new FormData();
銆銆for (var i = 0; i < files.length;i++) {
銆銆銆銆formData.append('files[]', files[i]);
銆銆}
鐒跺悗錛屽彂閫佽繖涓狥ormData瀵硅薄銆?/p>
銆銆xhr.send(formData);
涓冦佽法鍩熻祫婧愬叡浜紙CORS錛?/span>
鏂扮増鏈殑XMLHttpRequest瀵硅薄錛屽彲浠ュ悜涓嶅悓鍩熷悕鐨勬湇鍔″櫒鍙戝嚭HTTP璇鋒眰銆傝繖鍙仛"璺ㄥ煙璧勬簮鍏變韓"錛圕ross-origin resource sharing錛岀畝縐癈ORS錛夈?/p>
浣跨敤"璺ㄥ煙璧勬簮鍏變韓"鐨勫墠鎻愶紝鏄祻瑙堝櫒蹇呴』鏀寔榪欎釜鍔熻兘錛岃屼笖鏈嶅姟鍣ㄧ蹇呴』鍚屾剰榪欑"璺ㄥ煙"銆傚鏋滆兘澶熸弧瓚充笂闈㈢殑鏉′歡錛屽垯浠g爜鐨勫啓娉曚笌涓嶈法鍩熺殑璇鋒眰瀹屽叏涓鏍楓?/p>
銆銆xhr.open('GET', 'http://other.server/and/path/to/script');
鐩墠錛岄櫎浜咺E 8鍜孖E 9錛屼富嫻佹祻瑙堝櫒閮芥敮鎸丆ORS錛孖E 10涔熷皢鏀寔榪欎釜鍔熻兘銆傛湇鍔″櫒绔殑璁劇疆錛岃鍙傝?a target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">銆奡erver-Side Access Control銆?/a>銆?/p>
鍏佹帴鏀朵簩榪涘埗鏁版嵁錛堟柟娉旳錛氭敼鍐橫IMEType錛?/span>
鑰佺増鏈殑XMLHttpRequest瀵硅薄錛屽彧鑳戒粠鏈嶅姟鍣ㄥ彇鍥炴枃鏈暟鎹紙鍚﹀垯瀹冪殑鍚嶅瓧灝變笉鐢╔ML璧烽浜嗭級錛屾柊鐗堝垯鍙互鍙栧洖浜岃繘鍒舵暟鎹?/p>
榪欓噷鍙堝垎鎴愪袱縐嶅仛娉曘傝緝鑰佺殑鍋氭硶鏄敼鍐欐暟鎹殑MIMEType錛屽皢鏈嶅姟鍣ㄨ繑鍥炵殑浜岃繘鍒舵暟鎹吉瑁呮垚鏂囨湰鏁版嵁錛屽茍涓斿憡璇夋祻瑙堝櫒榪欐槸鐢ㄦ埛鑷畾涔夌殑瀛楃闆嗐?/p>
銆銆xhr.overrideMimeType("text/plain; charset=x-user-defined");
鐒跺悗錛岀敤responseText灞炴ф帴鏀舵湇鍔″櫒榪斿洖鐨勪簩榪涘埗鏁版嵁銆?/p>
銆銆var binStr = xhr.responseText;
鐢變簬榪欐椂錛屾祻瑙堝櫒鎶婂畠褰撳仛鏂囨湰鏁版嵁錛屾墍浠ヨ繕蹇呴』鍐嶄竴涓釜瀛楄妭鍦拌繕鍘熸垚浜岃繘鍒舵暟鎹?/p>
銆銆for (var i = 0, len = binStr.length; i < len; ++i) {
銆銆銆銆var c = binStr.charCodeAt(i);
銆銆銆銆var byte = c & 0xff;
銆銆}
鏈鍚庝竴琛岀殑浣嶈繍綆?c & 0xff"錛岃〃紺哄湪姣忎釜瀛楃鐨勪袱涓瓧鑺備箣涓紝鍙繚鐣欏悗涓涓瓧鑺傦紝灝嗗墠涓涓瓧鑺傛墧鎺夈傚師鍥犳槸嫻忚鍣ㄨВ璇誨瓧絎︾殑鏃跺欙紝浼氭妸瀛楃鑷姩瑙h鎴怳nicode鐨?xF700-0xF7ff鍖烘銆?/p>
鍏佹帴鏀朵簩榪涘埗鏁版嵁錛堟柟娉旴錛歳esponseType灞炴э級
浠庢湇鍔″櫒鍙栧洖浜岃繘鍒舵暟鎹紝杈冩柊鐨勬柟娉曟槸浣跨敤鏂板鐨剅esponseType灞炴с傚鏋滄湇鍔″櫒榪斿洖鏂囨湰鏁版嵁錛岃繖涓睘鎬х殑鍊兼槸"TEXT"錛岃繖鏄粯璁ゅ箋傝緝鏂扮殑嫻忚鍣ㄨ繕鏀寔鍏朵粬鍊鹼紝涔熷氨鏄錛屽彲浠ユ帴鏀跺叾浠栨牸寮忕殑鏁版嵁銆?/p>
浣犲彲浠ユ妸responseType璁句負blob錛岃〃紺烘湇鍔″櫒浼犲洖鐨勬槸浜岃繘鍒跺璞°?/p>
銆銆var xhr = new XMLHttpRequest();
銆銆xhr.open('GET', '/path/to/image.png');
銆銆xhr.responseType = 'blob';
鎺ユ敹鏁版嵁鐨勬椂鍊欙紝鐢ㄦ祻瑙堝櫒鑷甫鐨凚lob瀵硅薄鍗沖彲銆?/p>
銆銆var blob = new Blob([xhr.response], {type: 'image/png'});
娉ㄦ剰錛屾槸璇誨彇xhr.response錛岃屼笉鏄痻hr.responseText銆?/p>
浣犺繕鍙互灝唕esponseType璁句負arraybuffer錛屾妸浜岃繘鍒舵暟鎹鍦ㄤ竴涓暟緇勯噷銆?/p>
銆銆var xhr = new XMLHttpRequest();
銆銆xhr.open('GET', '/path/to/image.png');
銆銆xhr.responseType = "arraybuffer";
鎺ユ敹鏁版嵁鐨勬椂鍊欙紝闇瑕侀亶鍘嗚繖涓暟緇勩?/p>
銆銆var arrayBuffer = xhr.response;
銆銆if (arrayBuffer) {
銆銆銆銆var byteArray = new Uint8Array(arrayBuffer);
銆銆銆銆for (var i = 0; i < byteArray.byteLength; i++) {
銆銆銆銆銆銆// do something
銆銆銆銆}
銆銆}
鏇磋緇嗙殑璁ㄨ錛岃鐪?a target="_blank" style="margin: 0px; padding: 0px; list-style-type: none; border: none; color: #112233;">Sending and Receiving Binary Data銆?/p>
涔濄佽繘搴︿俊鎭?/span>
鏂扮増鏈殑XMLHttpRequest瀵硅薄錛屼紶閫佹暟鎹殑鏃跺欙紝鏈変竴涓猵rogress浜嬩歡錛岀敤鏉ヨ繑鍥炶繘搴︿俊鎭?/p>
瀹冨垎鎴愪笂浼犲拰涓嬭澆涓ょ鎯呭喌銆備笅杞界殑progress浜嬩歡灞炰簬XMLHttpRequest瀵硅薄錛屼笂浼犵殑progress浜嬩歡灞炰簬XMLHttpRequest.upload瀵硅薄銆?/p>
鎴戜滑鍏堝畾涔塸rogress浜嬩歡鐨勫洖璋冨嚱鏁般?/p>
銆銆xhr.onprogress = updateProgress;
銆銆xhr.upload.onprogress = updateProgress;
鐒跺悗錛屽湪鍥炶皟鍑芥暟閲岄潰錛屼嬌鐢ㄨ繖涓簨浠剁殑涓浜涘睘鎬с?/p>
銆銆function updateProgress(event) {
銆銆銆銆if (event.lengthComputable) {
銆銆銆銆銆銆var percentComplete = event.loaded / event.total;
銆銆銆銆}
銆銆}
涓婇潰鐨勪唬鐮佷腑錛宔vent.total鏄渶瑕佷紶杈撶殑鎬誨瓧鑺傦紝event.loaded鏄凡緇忎紶杈撶殑瀛楄妭銆傚鏋渆vent.lengthComputable涓嶄負鐪燂紝鍒檈vent.total絳変簬0銆?/p>
涓巔rogress浜嬩歡鐩稿叧鐨勶紝榪樻湁鍏朵粬浜斾釜浜嬩歡錛屽彲浠ュ垎鍒寚瀹氬洖璋冨嚱鏁幫細
銆銆* load浜嬩歡錛氫紶杈撴垚鍔熷畬鎴愩?/p>
銆銆* abort浜嬩歡錛氫紶杈撹鐢ㄦ埛鍙栨秷銆?/p>
銆銆* error浜嬩歡錛氫紶杈撲腑鍑虹幇閿欒銆?/p>
銆銆* loadstart浜嬩歡錛氫紶杈撳紑濮嬨?/p>
銆銆* loadEnd浜嬩歡錛氫紶杈撶粨鏉燂紝浣嗘槸涓嶇煡閬撴垚鍔熻繕鏄け璐ャ?/p>
鍗併侀槄璇繪潗鏂?/span>
銆銆1. Introduction to XMLHttpRequest Level 2錛?鏂板姛鑳界殑緇煎悎浠嬬粛銆?/p>
銆銆2. New Tricks in XMLHttpRequest 2錛氫竴浜涚敤娉曠殑浠嬬粛銆?/p>
銆銆3. Using XMLHttpRequest錛氫竴浜涢珮綰х敤娉曪紝涓昏閽堝Firefox嫻忚鍣ㄣ?/p>
銆銆4. HTTP Access Control錛欳ORS緇艱堪銆?/p>
銆銆5. DOM access control using cross-origin resource sharing錛欳ORS鐨?縐岺TTP澶翠俊鎭?/p>
銆銆6. Server-Side Access Control錛氭湇鍔″櫒绔疌ORS璁劇疆銆?/p>
銆銆7. Enable CORS錛氭湇鍔$CORS璁劇疆銆?/p>
錛堝畬錛?/p>