jQuery是一個非常流行的JavaScript框架,它簡化了JavaScript開發(fā)過程。其中,jQuery的AJAX模塊為網(wǎng)頁開發(fā)帶來了便利,可以通過Ajax發(fā)送異步請求獲得數(shù)據(jù),不必重新加載整個網(wǎng)頁。而JSONP則是一種跨域通信的技術(shù),允許從一個域名頁面上向另一個域名的頁面請求數(shù)據(jù)。下面我們來看jQuery AJAX JSONP的源碼。
//實現(xiàn)JSONP jQuery.ajaxSetup({ jsonp: "callback", // 回調(diào)函數(shù)名的key值 jsonpCallback: function () { // 回調(diào)函數(shù)名的處理函數(shù) return jQuery.expando + "_" + (jQuery.expandoIndex++).toString(36); } }); //發(fā)送JSONP請求 jQuery.ajax = function (options) { var callbackName = options.jsonpCallback || jQuery.ajaxSettings.jsonpCallback(); var script = document.createElement("script"); var url = options.url; if (typeof url === "string" && /\?/.test(url)) { url += "&" + options.jsonp + "=" + callbackName; } else { url += "?" + options.jsonp + "=" + callbackName; } script.src = url; script.async = true; var errorHandler = options.error; var successHandler = options.success; window[callbackName] = function (data) { options.success && options.success(data); delete window[callbackName]; document.head.removeChild(script); }; script.onerror = function () { options.error && options.error(); delete window[callbackName]; document.head.removeChild(script); }; document.head.appendChild(script); };
上述代碼實現(xiàn)了jQuery中AJAX JSONP的主要功能。在ajaxSetup函數(shù)中,我們設(shè)置了jsonp回調(diào)函數(shù)的默認(rèn)值為callback,同時jsonpCallback函數(shù)由我們自己定義,用于生成隨機的回調(diào)函數(shù)名,保證每一次請求都有唯一的回調(diào)函數(shù)名。
在ajax函數(shù)中,我們首先獲取jsonp回調(diào)函數(shù)名,然后動態(tài)創(chuàng)建一個script標(biāo)簽,設(shè)置其src為請求的URL,同時將async屬性設(shè)置為true,可以讓我們不必阻塞JavaScript的運行。接下來,我們定義了成功和失敗回調(diào)函數(shù),用以處理服務(wù)器返回的數(shù)據(jù)。
最后,我們將生成的