摘要:內部的幾個執行步驟創建對象設置請求頭連接服務器設置回調發送數據在回調函數中獲取數據利用標簽可以跨域請求資源解決跨域問題。
Ajax內部的幾個執行步驟
創建XMLHttpRequest對象(new XMLHttpRequest())
設置請求頭(setRequestHeader)
連接服務器(open())
設置回調(onreadyStateChange)
發送數據(send())
在回調函數中獲取數據
JSONP利用script標簽可以跨域請求資源解決跨域問題。詳細解釋可以看徹底弄懂跨域問題
前端代碼/* * 原生js實現Ajax * */ function Ajax(params) { params = params || {}; params.data = params.data || {}; var _json = params.jsonp ? jsonp(params): json(params); // 判斷是json還是jsonp function json(params) { // 普通請求 params.type = (params.type || "GET").toUpperCase(); // 設置請求默認類型 var urlData = formatParams(params.data); // 對數據進行格式化 var xhr = null; // 對xhr進行初始化 if (window.XMLHttpRequest) { xhr = new window.XMLHttpRequest(); } else { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } var headers = params.headers || {}; if (params.type === "GET") { xhr.open(params.type, params.url + "?" + urlData, true); setHeaders(xhr, headers); xhr.send(null); } else { xhr.open(params.type, params.url, true); setHeaders(xhr, headers); xhr.send(JSON.stringify(params.data)); } xhr.onreadystatechange = function () { if (xhr.readyState === 4) { var status = xhr.status; if (status >= 200 && status < 300) { var response = ""; var type = xhr.getResponseHeader("Content-Type"); if (type.indexOf("xml") !== -1 && xhr.responseXML) { // xml格式 response = xhr.responseXML; } else if (type.indexOf("application/json") !== -1) { // JSON格式 response = JSON.parse(xhr.responseText); } else { response = xhr.responseText; // 字符串格式 } params.success && params.success(response); } else { params.error && params.error(status); } } } } function jsonp(params) { var callbackName = params.jsonp; // 回調函數名 var head = document.getElementsByTagName("head")[0]; params.data["callback"] = callbackName; var data = formatParams(params.data); var script = document.createElement("script"); head.appendChild(script); // 創建jsonp函數,成功后自動讓success函數調用,在自動刪除 window[callbackName] = function (json) { // 設置回調,獲取后臺數據后才執行 head.removeChild(script); clearTimeout(script.timer); window[callbackName] = null; params.success && params.success(json); }; script.src = params.url + "?" + data; // 設置src的時候才開始向后臺請求數據 if (params.time) { // 限定時間 script.timer = setTimeout(function () { window[callbackName] = null; head.removeChild(script); params.error && params.error({ message: "超時" }) }, params.time) } } function formatParams(data) { // 使用 encodeURIComponent 對 URI的某部分編碼 var arr = []; for (var key in data) { arr.push(encodeURIComponent(key) + "=" + encodeURIComponent(data[key])); } // 添加隨機數,防止緩存 arr.push("v=" + random()); return arr.join("&"); } function random() { return Math.floor(Math.random() * 10000 + 500); } function setHeaders(xhr, headers) { for (var key in headers) { xhr.setRequestHeader(key, headers[key]); } } }使用方法
不用jsonp請求
Ajax({ url: "后端接口", type: "POST", headers: { "Content-Type": "application/json", token: "xxx" }, success(res) { console.log(res); }, error(status) { console.log(`some error status = ${status}`); } })
jsonp請求
Ajax({ url: "http://localhost:8080", headers: { "Content-Type": "application/json" }, jsonp: "getUser", time: 2000, success(res) { console.log(res); }, error(status) { console.log(`some error status = ${status.msg}`); } })jsonp后臺配置代碼
var querystring = require("querystring"); var http = require("http"); var server = http.createServer(); server.on("request", function(req, res) { var params = querystring.parse(req.url.split("?")[1]); var fn = params.callback; // jsonp返回設置 res.writeHead(200, { "Content-Type": "text/javascript" }); var data = { user: "xbc", password: "123456" } res.write(fn + "(" + JSON.stringify(data) + ")"); res.end(); }); server.listen("8080"); console.log("Server is running at port 8080...");參考文章
原生 JavaScript 實現 AJAX、JSONP
ajax 快速入門
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/102007.html
摘要:同源策略,它是由提出的一個著名的安全策略,現在所有支持的瀏覽器都會使用這個策略。客戶端在對文件調用成功之后,也就獲得了自己所需的數據,剩下的就是按照自己需求進行處理和展現了,這種獲取遠程數據的方式看起來非常像,但其實并不一樣。 參考資料 一、先說說JSON 首先JSON是一種基于文本的數據交換方式,或者叫做數據描述格式。 JSON的優點: 基于純文本,跨平臺傳遞極其簡單; Javas...
摘要:只有兩種數據類型描述符,大括號和方括號,其余英文冒號是映射符,英文逗號是分隔符,英文雙引號是定義符。上述兩種集合中若有多個子項,則通過英文逗號進行分隔。鍵值對以英文冒號進行分隔,并且建議鍵名都加上英文雙引號,以便于不同語言的解析。 由于Sencha Touch 2這種開發模式的特性,基本決定了它原生的數據交互行為幾乎只能通過AJAX來實現。當然了,通過調用強大的PhoneGap插件然后...
摘要:只有兩種數據類型描述符,大括號和方括號,其余英文冒號是映射符,英文逗號是分隔符,英文雙引號是定義符。上述兩種集合中若有多個子項,則通過英文逗號進行分隔。鍵值對以英文冒號進行分隔,并且建議鍵名都加上英文雙引號,以便于不同語言的解析。 由于Sencha Touch 2這種開發模式的特性,基本決定了它原生的數據交互行為幾乎只能通過AJAX來實現。當然了,通過調用強大的PhoneGap插件然后...
閱讀 704·2021-11-15 11:37
閱讀 3322·2021-10-27 14:14
閱讀 6099·2021-09-13 10:30
閱讀 2968·2021-09-04 16:48
閱讀 1935·2021-08-18 10:22
閱讀 2135·2019-08-30 14:19
閱讀 737·2019-08-30 10:54
閱讀 1754·2019-08-29 18:40