javascript --- XHR(XMLHttpRequet)對象

XHR:

// XHR(XMLHttpRequest):為向服務器發送請求和解析服務器響應提供了流暢的接口
// 能夠以異步方式從服務器取得更多信息,意味著用戶點擊后,可以不必刷新頁面也能取得新數據
// 換句話說,可以使用XHR對象獲取新數據,然后再通過DOM將新數據插入到頁面中.

XMLHttpRequest對象:

// IE5是第一款引入XHR對象的瀏覽器.再IE5中,XHR對象是通過MSXML庫中的一個ActiveX對象實現的.
// 因此,在IE中可能會遇到三種不同版本的XHR對象:
// IE7之前的生成xhr對象
function createXHR() {if(typeof arguments.callee.activeXString != "string") {var version = ["XSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0","XSXML2.XMLHttp"],i, len;for (i=0, len = versions.length; i < len; i++) {try {new activeXObject(versions[i]);arguments.callee.activeXString = versions[i];} catch (ex) {// jump this}}return new ActiveXObject( arguments.callee.activeXString);}
}// 支持IE7及更高的版本,生成xhr對象
function createXHR() {if (typeof XMLHttpRequest != "undefined") {return new XMLHttpRequest();} else if (typeof ActiveXObject != "undefined") {if (typeof arguments.callee.activeXString != "string") {var versions = [ "MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],i, len;for( i =0, len =versions.length;  i< len; i++) {try {new ActiveXObject(versions[i]);arguments.callee.activeXString = versions[i];break;} catct(ex) {// 跳過}}return new ActiveXObject(arguments.callee.activeXString);} else {throw new Error("No XHR object avilable.");}
}

XHR.open()創建一個待發送的請求:

// open():它接受3個參數:要發送的請求的類型("get","post"等)、請求的URL和是否異步發送請求的布爾值
// 利用上面定義的方法
var xhr = createXHR();
xhr.open("get", "example.php", false);// 以上代碼會啟動一個針對example.php的GET請求.
// 注1:以上的URL是相對于執行代碼的當前頁面
// 注2:open方法并不會真正發送請求,而只是啟動一個請求以備發送
// 注3:只能像同一個域中使用相同端口和協議的URL發送請求.

XHR.send()發送待發送請求:

// send():接收一個參數,即要作為請求主體發送的數據.如果不需要通過請求主體發送數據,則必須傳入null.
// 利用上面創建的待發送請求
xhr.send(null);

服務器響應的幾個XHR屬性:

// responseText: 作為響應主體被返回的文本
// responseXML: 如果響應的內容類型是"text/xml" 或”application/xml",這個屬性中將保存包含著響應數據的XML DOM文檔
// status: 響應的HTTP狀態
// statusText: HTTP狀態的說明// 可以像下面這樣檢測返回的status
xhr.open("get", url, false);   // 同步方式
xhr.send(null);if((xhr.status >= 200 && xhr.status <300) || xhr.status == 304) {alert(xhr.responseText);  // 響應主體
} else {alert("Request was unsuccessful: " + xhr.status);
}
// 注1:狀態碼304,代表請求資源未修改

XHR異步發送請求的readyState屬性:

// 該屬性表示請求 / 響應過程的當前活動階段
// xhr.readyState == 0:未初始化,尚未調用open方法
// xhr.readyState == 1: 啟動,調用了open方法,但未調用send方法
// xhr.readyState == 2: 發送,已經調用了send方法,但并未收到響應
// xhr.readyState == 3: 接收,已經接收到部分響應數據
// xhr.readyState == 4: 完成,已經接收到全部響應數據,而且已經可以在客戶端使用了// 看下面一個例子:
var xhr = createXHR();
xhr.onreadystatechange = function () {if ( xhr.readyState == 4) {if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {alert(xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.stauts);}}
};
xhr.open("get", url, true);    // 異步發送請求
xhr.send(null);// 注1:每次readyState改變時,都會觸發一次onreadystatuschange事件
// 注2:以上onreadystatuschange事件是通過DOM0級方法添加的(原因,DOM2級添加方法僅支持部分瀏覽器)// xhr.abort():用于在接收到響應前,取消異步請求
xhr.abort();

HTTP頭部信息:

// Accept: 瀏覽器能夠處理的內容類型
// Accept-Charset: 瀏覽器能夠顯示的字符集
// Accept-Encoding: 瀏覽器能夠處理的壓縮編碼
// Accept-Language: 瀏覽器當前設置的語言
// Connection: 瀏覽器域服務器之間連接的類型
// Cookie: 當前頁面設置的任何Cookie
// Host: 發出請求的頁面所在的域
// Referer: 發出請求的頁面的URI
// User-Agent: 瀏覽器的用戶代理// 使用xhr.setRequestHeader發送請求頭部信息.必須位于xhr.open和xhr.send之間
var xhr = createXHR();
xhr.onreadystatechange = function () {if ( xhr.readyState ==4 ){if(( xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {alert( xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.status);}}
}
xhr.open("get", url, true);
xhr.setRequestHeader("MyHeader", "MyValue");
xhr.send(null);// xhr.getResponseHeader():可以取得響應的響應頭部信息
// xhr.getAllResponseHeaders():可以取得一個包含所有頭部信息的長字符串
var myHeader = xhr.getResponseHeader("MyHeader");
var allHeaders = xhr.getAllResponseHeaders();

GET請求:

// 用于向服務器查詢某些信息,可以將查詢字符串參數追加到URL的末尾
// 查詢字符串中的每個參數的名稱和值都必須使用encodeURIComponent()進行編碼,然后才能放到URL的末尾// addURLParam
function addURLParam(url, name, value) {url += (url.indexOf("?") == -1 ? "?" : "&");url += encodeURIComponent(name) + "=" + encodeURIComponent(value);return url;
}// use
var url = "example.php";
url = addURLParam(url, "name", "Nicholas");   // example.php?name=Nicholas
url = addURLParam(url, "book", "Professional JavaScript"); // example.php?name=Nicholas&book=Professional%JavaScriptxhr.open("get", url, false);

POST請求:

// 通常用于向服務器發送應該被保存的數據// 使用XHR來模仿表單提交
function submitData() {var xhr = createXHR();xhr.onreadystatechange = function () {if ( xhr.readyState == 4) {if (( xhr.status >=200 && xhr.status < 300) || xhr.status == 304) {alert(xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.status);}}};xhr.open("post", "postexample.php", ture);xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");var form = document.getElementById("user-info");xhr.send(serialize(form));   // serialize是標準化表單元素的函數
}// 附:serialize()
function serialize (form) {var parts = [],i,len,j,optLen,option,optValue;for( i =0, len = form.elments.length; i< len; i ++) {filed = form.ekenebts[i];switch(field.type) {case "select-one":case "select-multiple":if(field.name.length) {for(j = 0, optLen = field.options.length; j < optLen; j++) {option = field.options[j];if(option.selected) {optValue = "";if ( option.hasAttribute) {optValue = (option.hasAttribute("value") ?option.value : option.text);} else {optValue = (option.attribute["value"].specified ?option.value : option.text);}parts.push(encodeURIComponent(field.name) + "=" +encodeURIComponent(optValue));}}}break;case undefined:case "file":case "submit":case "reset":case "button":break;case "radio":case "checkbox":if(!field.checked) {break;}default:if(field.name.length) {parts.push(encodeURIComponent (field.name) + "=" +encodeURIComponent (field.value));}}}return parts.join("&");
}// 注:在發送相同大小數據的時候,GET請求的速度最多可達POST請求速度的2倍

參考《JavaScript高級程序設計》(第3版)P436~P437 、P571~P578

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

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

相關文章

DOM-8 【兼容】冒泡捕獲流、事件與事件源對象、事件委托

事件流 1. 含義 描述從頁面中接收事件的順序 2. 分類 IE提出的 事件冒泡流 Event BubblingNetscape提出的 事件捕獲流 Event Capturing 3. 階段 事件捕獲階段 處于目標階段 事件冒泡階段 事件捕獲先于事件冒泡執行 dom dom0&#xff1a;定義句柄方式&#xff0c;兼…

IIS6.0,Apache低版本,PHP CGI 解析漏洞

IIS6.0解析漏洞 在IIS6.0下存在這樣的文件“名字.asp;名字.jpg” 代表了jpg文件可以以asp腳本類型的文件執行。 根據這個解析漏洞我們可以上傳這種名字類型的圖片&#xff0c;比如 1.asp;xxx.jpg 他會忽略;后邊的內容&#xff0c;所以文件相當于1.asp asp一句話木馬 <%eval …

UVA 3485 Bridge

題目大意 你的任務是修建一座大橋。橋上等距地擺放著若干個塔&#xff0c;塔高為H&#xff0c;寬度忽略不計。相鄰兩座塔之間的距離不能超過D。塔之間的繩索形成全等的對稱拋物線。橋長度為B&#xff0c;繩索總長為L&#xff0c;如下圖所示求建最少的塔時繩索的最下端離地的高度…

javascript --- XMLHttp2級、CORS(跨域資源共享)

FormData: // 為序列化表單以及創建與表單格式相同的數據提供了便利 var data new FromData(); data.append("name", "Nicholas");// 使用FormData標準化數據后,發送到服務器 var xhr createXHR(); xhr.onreadystatechange function () {if ( xhr.read…

ES5-拓展 this指向的總結

每個函數在執行時都有自己的this指向 1. 默認綁定規則&#xff1a; 全局中&#xff0c;this指向window this window函數的獨立調用&#xff0c;this默認指向window &#xff08;不要把獨立調用理解成window調用&#xff09; // 函數在全局中調用&#xff0c;也就是被window調…

Applet

Applets用于為Web應用程序提供交互功能&#xff0c;這些功能無法單獨由HTML提供。它們可以捕獲鼠標輸入&#xff0c;并且還具有按鈕或復選框等控件。響應于用戶動作&#xff0c;小應用程序可以改變提供的圖形內容。這使得小程序非常適合演示&#xff0c;可視化和教學。 一個app…

國內初創企業選擇云計算服務器價格對比

假設我們是一家初創企業&#xff0c;現在要選擇第一臺服務器。業務還未確定&#xff0c;只知道是互聯網業務 要求&#xff1a; 至少2核&#xff0c;否則多線程的軟件都跑不了至少4G內存&#xff0c;這樣可以運行數據庫或者elasticsearch這種比較吃內存的東西。或者說&#xff0…

javascript --- 幾個其他的跨域技術(圖像Ping、JSONP、Comet)

在CORS(Cross-Origin Resource Sharing,跨域資源共享)出現以前,要實現跨域Ajax通信是很難的. 可以利用DOM中能夠執行跨域請求的功能,來實現跨域通信: 瀏覽器到服務器的單向通信: 此項技術稱為圖像Ping,利用的是img.src的跨域事件 img.src只能通過偵聽load和error事件來確定瀏覽…

ES5-拓展 箭頭函數的this、this的優先級

讓內部函數的this指向和父函數的this&#xff0c;可以顯示改變this指向&#xff0c;也可以使用箭頭函數 箭頭代替了function關鍵字 箭頭函數內部沒有this指向&#xff0c;箭頭函數的this是穩定引用父作用域的。因為它的存在就是要穩定this指向。 適用于普通函數的所有綁定規則…

java 實現壓縮單個文件

先來實現一個簡單的單文件壓縮&#xff0c;主要是為了解一下壓縮需要使用到的流。。 效果&#xff1a; 說明&#xff1a;壓縮實現使用ZipOutputStream 代碼&#xff1a; package com.gx.compress;import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im…

jekins構建觸發器詳解

jenkins版本&#xff1a;2.89.2 1、觸發遠程構建 (例如,使用腳本)&#xff1a;通過一個網址的訪問來觸發構建&#xff0c;這樣就不需要登錄jenkins系統也能觸發構建了。 示例地址&#xff1a; http://localhost:8848/job/FlashRegistration/build??token口令&cause書寫構…

http --- 前端的緩存

前端的緩存分為: http緩存 和 瀏覽器緩存 http緩存: // 當客戶端向服務器請求資源時,會先抵達瀏覽器緩存,如果瀏覽器有"要請求資源"的副本 // 就會從瀏覽器緩存中提取而不是從原始服務器中提取這個資源// 常見的http緩存,只能緩存get請求響應的資源,對于其他類型的響…

ES5-拓展 隱式數據類型轉換

Boolean轉換原則&#xff1a;非假即真 6種虛值 原始值轉換為原始值 對象轉換為原始值 Date()和new Date() new Date可以不寫括號(new方式返回的一定是對象)&#xff0c;返回Date對象Date()返回函數執行&#xff0c;返回時間字符串 引用值轉原始值 先找valueOf方法(一般…

Swagger的簡單入門【轉載】

一、Swagger簡介 上一篇文章中我們介紹了Spring Boot對Restful的支持&#xff0c;這篇文章我們繼續討論這個話題&#xff0c;不過&#xff0c;我們這里不再討論Restful API如何實現&#xff0c;而是討論Restful API文檔的維護問題。 在日常的工作中&#xff0c;我們往往需要給前…

visual studio code搭建本地服務器(node.js+express)

一、安裝node.js&#xff08;常規軟件安裝流程&#xff0c;比較簡單&#xff0c;不用贅述&#xff09; 二、安裝express框架 1. 打開Windows命令提示符&#xff0c;輸入&#xff1a; npm install express -g&#xff0c;等待&#xff0c;安裝好如下所示&#xff1a; npm instal…

es6 --- 手寫一個promise

一個promise實例: var getJSON function(url) {var promise new Promise(function(resolve, reject) {// XHR對象發現ajax請求var client new XMLHttpReqeust();client.open("GET", url);client.onreadystatechange handler;client.responseType "json&qu…

最大流模版 EK

EK算法基于增廣路的思想,易于理解,但由于低效并不被經常使用 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <queue> using namespace std; const int MAXN10005,MAXM100005…

Restrictions查詢用法

Restrictions查詢用法 HQL運算符 QBC運算符 含義 Restrictions.eq() 等于equal <> Restrictions.ne() 不等于not equal > Restrictions.gt() 大于greater than > Restrictions.ge() 大于等于greater than or equal < Restrictions.lt() 小…

chrome調試

技術拓展直播課8 按chrome的官方文檔 長按刷新 清除緩存&#xff08;不一定好使&#xff09; Ctrl f 查找類 console控制臺見b站 bilibili source面板直接打斷點 效果和debugger一樣 單步調試 進入到函數的下一步 網速 no throttling 是否需要過濾 domcontentloaded d…

es6 --- promise和async/await的區別

首先需要了解async函數: async是Generator函數的語法糖: // 使用Generator依次讀取兩個文件 var fs require(fs); var readFile function (fileName) {return new Promise(function (resolve, reject) {fs.readFile(filename, function(error, data) {if (error) return re…