摘要:需求場景借助來自定義擴(kuò)展功能。項(xiàng)目需求版本,錯(cuò)誤打點(diǎn),發(fā)起請求發(fā)生錯(cuò)誤的時(shí)候前端需要向打點(diǎn)地址發(fā)送一個(gè)請求。項(xiàng)目需求防止請求的重復(fù)提交簡單演示解決方案不重復(fù)發(fā)送相同請求測試代碼
需求場景:借助 ajaxTransport 來自定義擴(kuò)展功能。
項(xiàng)目需求:jQuery 版本: 1.10.2,錯(cuò)誤打點(diǎn),發(fā)起 jsonp 請求發(fā)生錯(cuò)誤的時(shí)候前端需要向打點(diǎn)地址發(fā)送一個(gè)請求。
簡單演示:
測試代碼:
$.ajax("http://google.com/a.js", { type: "GET", dataType: "jsonp", success: function(success, statusText, jqXHR){ console.log("jsonp request success"); }, error: function(jqXHR, statusText, error){ console.log("jsonp error"); } }); 由于 1.10.2 版本的 jquery 并沒有對創(chuàng)建的 script 監(jiān)聽錯(cuò)誤事件,故無法調(diào)用 error 方法,故無法進(jìn)一步將前端信息錯(cuò)誤上報(bào)
解決方案:
$.ajaxTransport("+script", function(s){ // This transport only deals with cross domain requests var script, head = document.head || $("head")[0] || document.documentElement; return { send: function(_, callback) { script = document.createElement("script"); script.async = true; if(s.scriptCharset){ script.charset = s.scriptCharset; } script.src = s.url; // Handle error script.onerror = function(err){ // Handle memory lead in IE script.onload = script.onreadystatechange = null; script.onerror = null; // Remove the script if(script.parentNode){ script.parentnode.removeChild(script); } // Dereference the script script = null; if(err.type === "error"){ callback(404, err.type); } } // Attach handlers for all browsers script.onload = script.onreadystatechange = function(_, isAbort){ if(isAbort || !script.readyState || /loaded|complete/.test(script.readyState)){ // Handle memeory leak in IE script.onload = script.onreadystatechange = null; // Remove the script if(script.parentNode){ script.parentNode.removeChild(script); } // Dereference the script script = null; // Callback if not abort if(!isAbort){ callback(200, "success"); } } }; // Cicumvent IE6 bugs with base elements (#2709 and #4378) by prepending // Use native DOM manipulation to avoid our domManip AJAX trickery head.insertBefore(script, head.firstChild); }, abort: function(){ if(script){ script.onload(undefined, true); } } }; });需求場景:借助 ajaxSetup 新增 dataType.
項(xiàng)目需求:需要從服務(wù)器獲取 yaml 文件,然后解析該文件
簡單演示:
解決方案:
function parseYaml(text){ console.log("You are parsing yaml file!"); return "yaml" + text + "yaml"; } $.ajaxSetup({ accepts: { yaml: "application/x-yaml, text/yaml" }, contents: { yaml: /yaml/ }, converters: { "text yaml": function(text){ return parseYaml(text); } } });
測試代碼:
// 發(fā)送 dataType 為 yaml 的請求 $.ajax({ url: "http://google.com/helloworld.yaml", dataType: "yaml", success: function(data){ console.log(data); } });需求場景:借助 ajaxPrefilter 來自定義擴(kuò)展功能。
項(xiàng)目需求:防止 ajax 請求的重復(fù)提交
簡單演示:
解決方案:
var pendingRequests = {};
function storePendingRequest(key, jqXHR){
pendingRequests[key] = true; jqXHR.pendingRequestKey = key;
}
function generatePendingRequestKey(options){
return (options.type + options.url + options.dataType).toLowerCase().replace(/[^a-z0-9]/g, "");
}
$.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
// 不重復(fù)發(fā)送相同請求 var key = generatePendingRequestKey(options); if (!pendingRequests[key]) { storePendingRequest(key, jqXHR); } else { // or do other jqXHR.abort(); } var complete = options.complete; options.complete = function(jqXHR, textStatus) { // clear from pending requests pendingRequests[jqXHR.pendingRequestKey] = null; if ($.isFunction(complete)) { complete.apply(this, arguments); } };
});
測試代碼:
for(var i = 0; i < 10; i++){
var j = 0; $.ajax({ url: "http://js.passport.qihucdn.com/5.0.2.js", type: "GET", dataType: "HTML", complete: function(){ console.log("complete:" + j++); } });
}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/79139.html
摘要:以為例構(gòu)造函數(shù)的內(nèi)容構(gòu)造函數(shù)的內(nèi)部一般會(huì)做以下幾個(gè)操作各種給內(nèi)部對象設(shè)置屬性。為什么呢源碼做出了解釋。在里面會(huì)調(diào)用用戶傳入的回調(diào)函數(shù)并觸發(fā)事件表示已經(jīng)同步了。整個(gè)的源碼事實(shí)上就是這兩組東西。 1. 開場 強(qiáng)烈建議一邊看著源碼一邊讀本文章,本文不貼大段代碼。源碼地址。在寫backbone應(yīng)用的時(shí)候,說實(shí)話,大部分的時(shí)間都是在寫這三個(gè)模塊的內(nèi)容。關(guān)于這三個(gè)模塊的分析網(wǎng)上隨隨便便就能找到一堆...
摘要:事件關(guān)于路由觸發(fā)事件是通過兩個(gè)函數(shù)來完成的,它們分別是和前者會(huì)檢測路由是否發(fā)生了改變,如果改變了就會(huì)觸發(fā)函數(shù)并調(diào)用函數(shù),而后者會(huì)通過路由片段來找到相關(guān)的事件函數(shù)來觸發(fā)。 注意:強(qiáng)烈建議一邊閱讀源碼一邊閱讀本文。 終于到了backbone源碼解讀的最后一篇,這一篇和前面幾篇時(shí)間上有一定的間隔(因?yàn)橐貙W(xué)校有一堆亂七八糟的事...)。在這一篇里面會(huì)講解Bakcbone的sync & rou...
摘要:而在構(gòu)造函數(shù)中,返回了的實(shí)例對象。在中直接返回過的實(shí)例,這里的是的真正構(gòu)造函數(shù)最后對外暴露入口時(shí),將字符與對等起來。因此當(dāng)我們直接使用創(chuàng)建一個(gè)對象時(shí),實(shí)際上是創(chuàng)建了一個(gè)的實(shí)例,這里的正真構(gòu)造函數(shù)是原型中的方法。 showImg(https://segmentfault.com/img/remote/1460000008749398); 早幾年學(xué)習(xí)前端,大家都非常熱衷于研究jQuery源...
摘要:個(gè)人認(rèn)為,讀懂老牌框架的源代碼比會(huì)用流行框架的要有用的多。另外,源代碼中所有的以開頭的方法,可以認(rèn)為是私有方法,是沒有必要直接使用的,也不建議用戶覆蓋。 寫在前面 backbone是我兩年多前入門前端的時(shí)候接觸到的第一個(gè)框架,當(dāng)初被backbone的強(qiáng)大功能所吸引(當(dāng)然的確比裸寫js要好得多),雖然現(xiàn)在backbone并不算最主流的前端框架了,但是,它里面大量設(shè)計(jì)模式的靈活運(yùn)用,以及令...
摘要:個(gè)人認(rèn)為,讀懂老牌框架的源代碼比會(huì)用流行框架的要有用的多。另外,源代碼中所有的以開頭的方法,可以認(rèn)為是私有方法,是沒有必要直接使用的,也不建議用戶覆蓋。 寫在前面 backbone是我兩年多前入門前端的時(shí)候接觸到的第一個(gè)框架,當(dāng)初被backbone的強(qiáng)大功能所吸引(當(dāng)然的確比裸寫js要好得多),雖然現(xiàn)在backbone并不算最主流的前端框架了,但是,它里面大量設(shè)計(jì)模式的靈活運(yùn)用,以及令...
閱讀 839·2021-10-25 09:48
閱讀 615·2021-08-23 09:45
閱讀 2508·2019-08-30 15:53
閱讀 1765·2019-08-30 12:45
閱讀 604·2019-08-29 17:21
閱讀 3419·2019-08-27 10:56
閱讀 2555·2019-08-26 13:48
閱讀 704·2019-08-26 12:24