1. 程式人生 > >關於jsonp跨域的 實現

關於jsonp跨域的 實現

字符串 url fun jsonp span lba 如果 data class

1.實現原理

  1.把接口寫在 script標簽的src 中 這個接口就可以訪問(不會存在跨域問題 因為接口在瀏覽器地址欄是可以訪問的 會返回json字符串);

  2.直接寫不可以 因為正常情況下 scr請求來的是可執行的js代碼 此時返回的是json對象 所以程序報錯;

  3.src後拼接callback函數參數 返回的json對象就會跑到 這個函數的參數中 (原因不明覺厲);

  4.然後就可以在這個函數中 操作請求來的 json對象了 完成;

2.代碼實現

     //如果函數名,全是一個,任何的業務,都是回調這一個了
        var callbackName = 
callback_ + Date.now(); //聲明唯一的函數名 var myUrl = url + ?callback= + callbackName; //拼接src的路徑 //創建標簽 var script = document.createElement(script); script.src = myUrl; //不會發請求 //掛載全局函數 window[callbackName] = function(data) { //假設callbackName=‘a‘,服務器回寫: a(‘數據‘) console.log(data); delete window[callbackName];
//刪除window上一堆時間戳的函數 保持性能 } //插入到body中,觸發請求
  document.body.appendChild(script);

3.封裝成函數

function jsonpFn(url,callback){
    var callbackName = ‘callback_‘ + Date.now();  
     var script = document.createElement(‘script‘);
     script.src = url + ‘?callback=‘ + callbackName;
     window[callbackName] 
= function(data) { callback(); delete window[callbackName];    document.body.appendChild(script) }

//調用
jsonp("https://api.douban.com/v2/movie/in_theaters",function(res){
    //res 為請求來的數據
    //根據業務操作res
})

關於jsonp跨域的 實現