国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

lavor / 3182人閱讀

摘要:需求場景借助來自定義擴(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

相關(guān)文章

  • Backbone源碼解讀(二)

    摘要:以為例構(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)上隨隨便便就能找到一堆...

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

    摘要:事件關(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...

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

    摘要:而在構(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源...

    RebeccaZhong 評論0 收藏0
  • backbone源碼解讀

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

    Kross 評論0 收藏0
  • backbone源碼解讀

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

    wangxinarhat 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<