一、JS原生Ajax
ajax:一種請求資料的方式,不需要刷新整個頁面;
ajax的技術核心是XMLHttpRequest 物件;
ajax 請求流程:建立XMLHttpRequest 物件、連接資料伺服器、傳送請求、接收回應資料;
下面簡單封裝一個函數,之後稍作解釋
ajax({ url: "./TestXHR.aspx", //请求地址 type: "POST", //请求方式 data: { name: "super", age: 20 }, //请求参数 dataType: "json", success: function (response, xml) { // 此处放成功后执行的代码 }, fail: function (status) { // 此处放失败后执行的代码 } }); function ajax(options) { options = options || {}; options.type = (options.type || "GET").toUpperCase(); options.dataType = options.dataType || "json"; var params = formatParams(options.data); //创建 - 非IE6 - 第一步 if (window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); } else { //IE6及其以下版本浏览器 var xhr = new ActiveXObject('Microsoft.XMLHTTP'); } //接收 - 第三步 xhr.onreadystatechange = function () { if (xhr.readyState == 4) { var status = xhr.status; if (status >= 200 && status < 300) { options.success && options.success(xhr.responseText, xhr.responseXML); } else { options.fail && options.fail(status); } } } //连接 和 发送 - 第二步 if (options.type == "GET") { xhr.open("GET", options.url + "?" + params, true); xhr.send(null); } else if (options.type == "POST") { xhr.open("POST", options.url, true); //设置表单提交时的内容类型 xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(params); } } //格式化参数 function formatParams(data) { var arr = []; for (var name in data) { arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name])); } arr.push(("v=" + Math.random()).replace(".")); return arr.join("&"); }
1、創建
1.1、IE7及其以上版本中支援原生的XHR 對象,因此可以直接使用: var oAjax = new XMLHttpRequest(); 1.2、IE6及其先前的版本中,XHR物件是透過MSXML庫中的一個ActiveX物件實現的。有的書中細化了IE中此類物件的三種不同版本,即MSXML2.XMLHttp.6.0;個人感覺太麻煩,可以直接使用下面的語句創建: var oAjax =new ActiveXObject('Microsoft.XMLHTTP');
2、連接和發送
2.1、open()函數的三個參數:請求方式、請求地址、是否非同步請求(同步請求的情況極少,至今還沒用過);
2.2、GET 請求方式是透過URL參數將資料提交到伺服器的,POST則是透過將資料作為send 的參數提交到伺服器;
2.3、POST 請求中,在發送資料之前,要設定表單提交的內容類型;
2.4、提交到伺服器的參數必須經過encodeURIComponent() 方法進行編碼,實際上在參數清單」key=value」的形式中,key 和value 都需要編碼,因為會包含特殊字元。每次請求的時候都會在參數清單中拼入一個 “v=xx” 的字串,這樣是為了拒絕緩存,每次都直接請求到伺服器上。
encodeURI() :用於整個URI 的編碼,不會對本身屬於URI 的特殊字元進行編碼,如冒號、正斜線、問號和井號;其對應的解碼函數decodeURI();
:用於對URI 中的某一部分進行編碼,會對它發現的任何非標準字元進行編碼;其對應的解碼函數decodeURIComponent();
3、接收
3.1、接收到回應後,回應的資料會自動填入XHR對象,相關屬性如下
responseText:回應回傳的主體內容,為字串型別; responseXML:如果回應的內容型別是"text/xml" 或"application/xml",這個屬性中將保存著對應的xml 數據,是XML 對應的document 類型;
status:回應的HTTP狀態碼;
statusText:HTTP狀態的說明;
3.2、XHR statusText:HTTP狀態的說明;
3.2、XHR表示物件的readyState屬性表示請求/回應過程的當前活動階段,這個屬性的值如下
0-未初始化,尚未呼叫open()方法;
1-啟動,呼叫了open()方法,未呼叫send()方法;
2-傳送,已經呼叫了send()方法,未接收到回應;
3-接收,已經接收到部分回應資料;
4-完成,已經接收到全部回應資料;
只要readyState 的數值變化,就會呼叫readystatechange 事件,(其實為了邏輯上通順,可以把邏輯上通順,可以把邏輯上通順,可以把邏輯上通順,可以把邏輯上通順readystatechange放到send之後,因為send時請求伺服器,會進行網路通信,需要時間,在send之後指定readystatechange事件處理程序也是可以的,我通常都是這樣用,但為了規範和跨瀏覽器相容性,還是在open之前進行指定吧)。
3.3、在readystatechange事件中,先判斷回應是否接收完成,然後判斷伺服器是否成功處理請求,xhr.status 是狀態碼,狀態碼以2開頭的都是成功,304表示從快取中獲取,上面的代碼在每次請求的時候都加入了隨機數,所以不會從快取中取值,故狀態不需判斷。
4、ajax請求是不能跨域的!
二、JSONP
JSONP(JSON with Padding) 是一種跨域請求方式。主要原理是利用了script 標籤可以跨域請求的特點,由其src 屬性發送請求到伺服器,伺服器返回js 程式碼,網頁端接受回應,然後就直接執行了,這和透過script 標籤引用外部文件的原理是一樣的。
JSONP由兩部分組成:回呼函數和數據,回呼函數一般是由網頁端控制,作為參數發往伺服器端,伺服器端把該函數和數據拼成字串返回。
例如網頁端建立一個 script 標籤,並給其 src 賦值為 http://www.superfiresun.com/json/?callback=process, 此時網頁端就發起一個請求。服務端將要傳回的資料拼好最為函數的參數傳入,服務端傳回的資料格式類似”process({'name':'superfiresun'})”,網頁端接收到了回應值,因為請求者是script,所以相當於直接呼叫process 方法,並且傳入了一個參數。
單看響應回傳的數據,JSONP 比 ajax 方式就多了一個回呼函數。
function jsonp(options) { options = options || {}; if (!options.url || !options.callback) { throw new Error("参数不合法"); } //创建 script 标签并加入到页面中 var callbackName = ('jsonp_' + Math.random()).replace(".", ""); var oHead = document.getElementsByTagName('head')[0]; options.data[options.callback] = callbackName; var params = formatParams(options.data); var oS = document.createElement('script'); oHead.appendChild(oS); //创建jsonp回调函数 window[callbackName] = function (json) { oHead.removeChild(oS); clearTimeout(oS.timer); window[callbackName] = null; options.success && options.success(json); }; //发送请求 oS.src = options.url + '?' + params; //超时处理 if (options.time) { oS.timer = setTimeout(function () { window[callbackName] = null; oHead.removeChild(oS); options.fail && options.fail({ message: "超时" }); }, time); } }; //格式化参数 function formatParams(data) { var arr = []; for (var name in data) { arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[i])); } return arr.join('&'); }
1、因为 script 标签的 src 属性只在第一次设置的时候起作用,导致 script 标签没法重用,所以每次完成操作之后要移除;
2、JSONP这种请求方式中,参数依旧需要编码;
3、如果不设置超时,就无法得知此次请求是成功还是失败;
三、模仿JQuery中的ready()事件
1、DOMContentLoaded事件,在DOM树加载完成之后立即执行,始终会在load之前执行。
IE9+、FF、Chrome、Safari3.1+和Opera9+都支持该事件。
对于不支持该事件的浏览器,可以使用如下代码:
setTimeout(function(){
// 代码块}, 0) ;
DOMContentLoaded 事件只能通过 DOM2 级方式添加,即采用addEventListener()/attachEvent() 方式添加才能够使用。事件对象不会提供任何额外信息。
2、readystatechange事件
IE为DOM文档中的某些部分(区别于 XHR 对象的 readystatechange 事件)提供了该事件,这个事件的目的是提供与文档或元素的加载状态有关的信息,但这个事件的行为有时候也很难预料。支持该事件的对象都有一个readyState属性,注意,不是 event 事件对象。IE、Firefox4+和Opera 支持该事件。
readyState属性的值如下:
“uninitialized” - 未初始化:对象存在但尚未初始化;
“loading” - 正在加载:对象正在加载数据;
“loaded” - 加载完毕,对象加载数据完毕;
“interactive” - 交互:可以操作对象了,但还没有完全加载;
“complete” - 完成:对象已经加载完成;
2.1、并非所有的对象都会经历readyState的这几个阶段,如果这个阶段不适用某个对象,则该对象完全可能跳过该阶段,并没有规定哪个阶段适用于哪个对象。这意味着 readystatechange 事件经常会少于4次,相对应的 readyState 属性值也不是连续的。
2.2、对于 document 而言,interactive 和 complete 阶段会在于 DOMContentLoaded 大致相同的时刻触发 readystatechange 事件;
load 事件和 readystatechange 事件的触发顺序会因页面的外部资源的多少而变化,也就是说,readystatechange 事件并不会一直在 load 事件之前执行。外部资源越多,对 readystatechange 事件就越有利。
interactive 和 complete 的顺序也是不一致的,谁都有可能先执行,引用的外部资源越多,对交互阶段越有利。所以为了尽可能早的执行代码,两个状态要同时判断。
3、doScroll
IE5.5+支持,当页面中有滚动条时,可以用 doScroll("right")/doScroll("down") 等来移动滚动条,这个方法只有等DOM加载完成以后才能用,所以在IE低版本浏览器中可以通过这个属性判断 DOM 结构是否加载完成。介绍这个属性主要是模仿 jquery 中的解决方案。
function ready(readyFn) { //非IE浏览器 if (document.addEventListener) { document.addEventListener('DOMContentLoaded', function () { readyFn && readyFn(); }, false); } else { //方案1和2 哪个快用哪一个 var bReady = false; //方案1 document.attachEvent('onreadystatechange', function () { if (bReady) { return; } if (document.readyState == 'complete' || document.readyState == "interactive") { bReady = true; readyFn && readyFn(); }; }); //方案2 //jquery也会担心doScroll会在iframe内失效,此处是判断当前页是否被放在了iframe里 if (!window.frameElement) { setTimeout(checkDoScroll, 1); } function checkDoScroll() { try { document.documentElement.doScroll("left"); if (bReady) { return; } bReady = true; readyFn && readyFn(); } catch (e) { // 不断检查 doScroll 是否可用 - DOM结构是否加载完成 setTimeout(checkDoScroll, 1); } }; } };
注:
setTimeout(checkDoScroll, 1); 目的是让浏览器尽快执行 checkDoScroll 函数,间隔时间设置为 1ms,对当下的浏览器来说是不太可能的。每个浏览器都有自己默认的最小间隔时间,即使时间设置为最小间隔时间,也只是代表隔这些时间过去之后,JavaScript 会把 checkDoScroll 加入到执行队列中,如果此时 JavaScript 进程空闲,则会立即执行该代码。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用

WebStorm Mac版
好用的JavaScript開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器