成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

ajax 源碼解讀之如何擴(kuò)展 ajax 的功能

lavor / 3186人閱讀

摘要:需求場(chǎng)景借助來(lái)自定義擴(kuò)展功能。項(xiàng)目需求版本,錯(cuò)誤打點(diǎn),發(fā)起請(qǐng)求發(fā)生錯(cuò)誤的時(shí)候前端需要向打點(diǎn)地址發(fā)送一個(gè)請(qǐng)求。項(xiàng)目需求防止請(qǐng)求的重復(fù)提交簡(jiǎn)單演示解決方案不重復(fù)發(fā)送相同請(qǐng)求測(cè)試代碼

需求場(chǎng)景:借助 ajaxTransport 來(lái)自定義擴(kuò)展功能。

項(xiàng)目需求:jQuery 版本: 1.10.2,錯(cuò)誤打點(diǎn),發(fā)起 jsonp 請(qǐng)求發(fā)生錯(cuò)誤的時(shí)候前端需要向打點(diǎn)地址發(fā)送一個(gè)請(qǐng)求。

簡(jiǎn)單演示:
測(cè)試代碼:

   $.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 并沒(méi)有對(duì)創(chuàng)建的 script 監(jiān)聽(tīng)錯(cuò)誤事件,故無(wú)法調(diào)用 error 方法,故無(wú)法進(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);
               }
           }
       };
   });

需求場(chǎng)景:借助 ajaxSetup 新增 dataType.

項(xiàng)目需求:需要從服務(wù)器獲取 yaml 文件,然后解析該文件

簡(jiǎn)單演示:
解決方案:

   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);
           }
       }
   });

測(cè)試代碼:

   // 發(fā)送 dataType 為 yaml 的請(qǐng)求
   $.ajax({
       url: "http://google.com/helloworld.yaml",
       dataType: "yaml",
       success: function(data){
           console.log(data);
       }
   });

需求場(chǎng)景:借助 ajaxPrefilter 來(lái)自定義擴(kuò)展功能。

項(xiàng)目需求:防止 ajax 請(qǐng)求的重復(fù)提交

簡(jiǎn)單演示:
解決方案:
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ā)送相同請(qǐng)求
   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);
       }
   };

});

測(cè)試代碼:
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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79139.html

相關(guān)文章

  • Backbone源碼解讀(二)

    摘要:以為例構(gòu)造函數(shù)的內(nèi)容構(gòu)造函數(shù)的內(nèi)部一般會(huì)做以下幾個(gè)操作各種給內(nèi)部對(duì)象設(shè)置屬性。為什么呢源碼做出了解釋。在里面會(huì)調(diào)用用戶(hù)傳入的回調(diào)函數(shù)并觸發(fā)事件表示已經(jīng)同步了。整個(gè)的源碼事實(shí)上就是這兩組東西。 1. 開(kāi)場(chǎng) 強(qiáng)烈建議一邊看著源碼一邊讀本文章,本文不貼大段代碼。源碼地址。在寫(xiě)backbone應(yīng)用的時(shí)候,說(shuō)實(shí)話(huà),大部分的時(shí)間都是在寫(xiě)這三個(gè)模塊的內(nèi)容。關(guān)于這三個(gè)模塊的分析網(wǎng)上隨隨便便就能找到一堆...

    Sleepy 評(píng)論0 收藏0
  • Backbone源碼解讀(三)

    摘要:事件關(guān)于路由觸發(fā)事件是通過(guò)兩個(gè)函數(shù)來(lái)完成的,它們分別是和前者會(huì)檢測(cè)路由是否發(fā)生了改變,如果改變了就會(huì)觸發(fā)函數(shù)并調(diào)用函數(shù),而后者會(huì)通過(guò)路由片段來(lái)找到相關(guān)的事件函數(shù)來(lái)觸發(fā)。 注意:強(qiáng)烈建議一邊閱讀源碼一邊閱讀本文。 終于到了backbone源碼解讀的最后一篇,這一篇和前面幾篇時(shí)間上有一定的間隔(因?yàn)橐貙W(xué)校有一堆亂七八糟的事...)。在這一篇里面會(huì)講解Bakcbone的sync & rou...

    feng409 評(píng)論0 收藏0
  • 前端基礎(chǔ)進(jìn)階(十一):詳細(xì)圖解jQuery對(duì)象,以及如何擴(kuò)展jQuery插件

    摘要:而在構(gòu)造函數(shù)中,返回了的實(shí)例對(duì)象。在中直接返回過(guò)的實(shí)例,這里的是的真正構(gòu)造函數(shù)最后對(duì)外暴露入口時(shí),將字符與對(duì)等起來(lái)。因此當(dāng)我們直接使用創(chuàng)建一個(gè)對(duì)象時(shí),實(shí)際上是創(chuàng)建了一個(gè)的實(shí)例,這里的正真構(gòu)造函數(shù)是原型中的方法。 showImg(https://segmentfault.com/img/remote/1460000008749398); 早幾年學(xué)習(xí)前端,大家都非常熱衷于研究jQuery源...

    RebeccaZhong 評(píng)論0 收藏0
  • backbone源碼解讀

    摘要:個(gè)人認(rèn)為,讀懂老牌框架的源代碼比會(huì)用流行框架的要有用的多。另外,源代碼中所有的以開(kāi)頭的方法,可以認(rèn)為是私有方法,是沒(méi)有必要直接使用的,也不建議用戶(hù)覆蓋。 寫(xiě)在前面 backbone是我兩年多前入門(mén)前端的時(shí)候接觸到的第一個(gè)框架,當(dāng)初被backbone的強(qiáng)大功能所吸引(當(dāng)然的確比裸寫(xiě)js要好得多),雖然現(xiàn)在backbone并不算最主流的前端框架了,但是,它里面大量設(shè)計(jì)模式的靈活運(yùn)用,以及令...

    Kross 評(píng)論0 收藏0
  • backbone源碼解讀

    摘要:個(gè)人認(rèn)為,讀懂老牌框架的源代碼比會(huì)用流行框架的要有用的多。另外,源代碼中所有的以開(kāi)頭的方法,可以認(rèn)為是私有方法,是沒(méi)有必要直接使用的,也不建議用戶(hù)覆蓋。 寫(xiě)在前面 backbone是我兩年多前入門(mén)前端的時(shí)候接觸到的第一個(gè)框架,當(dāng)初被backbone的強(qiáng)大功能所吸引(當(dāng)然的確比裸寫(xiě)js要好得多),雖然現(xiàn)在backbone并不算最主流的前端框架了,但是,它里面大量設(shè)計(jì)模式的靈活運(yùn)用,以及令...

    wangxinarhat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<