JSONP 跨域讀取數據

由於瀏覽器同源策略,凡是發送請求url的協議、域名、端口三者之間任意一與當前頁面地址不同即爲跨域。

src:可以跨域

所以img 和 script 標籤可以實現跨域

跨域讀取數據
1.在本域下請求一個別的域名下的js,這個js會返回一些數據,可以在本域上獲取,使用。
2.通過添加<script>標籤來實現跨域。


實現:
//百度搜索js請求響應:jQuery1102015140022528893105_1507681428156({"q":"百度","p":false,"bs":"padstart","csor":"2","status":0,"g":[ { "q": "百度地圖", "t": "n", "st": { "q": "百度地圖", "new": 0 } }, { "q": "百度翻譯", "t": "n", "st": { "q": "百度翻譯", "new": 0 } },... ],"s":["百度地圖","百度翻譯","百度網盤","百度殺毒","百度衛士","百度文庫","百度雲盤","百度學術","百度貼吧","百度雲"]});

//360搜索js請求響應: suggest_so({"query":"百度","ext":"eci=f7753152f369dc9f&nlpv=suggest_3.2.2","result":[{"word":"百度一下","resrc":"ori","source":""},{"word":"百度外賣","resrc":"ori","source":""},{"word":"百度雲盤登陸入口","resrc":"ori","source":""},{"word":"百度雲盤登錄首頁","resrc":"ori","source":""},{"word":"百度網盤登陸","resrc":"ori","source":""},{"word":"百度雲","resrc":"ori","source":""},{"word":"百度地圖","resrc":"ori","source":""}],"version":"3.2.2"});

//動態添加<script>標籤
function f1() {
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = '/static/js/testjs.js';
    head.appendChild(script);
}

//以360爲例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>360搜索</title>
    <script type="text/javascript">
        //360響應suggest_so(....)格式的數據,所以先創建一個這樣的方法通過參數去取得數據
        function suggest_so(data) {
            //獲取響應的數據
            console.log(data)
        }
    </script>
    //會調用事先定義好的suggest_so(data)
    //<script>的src中的參數可通過拼接的方式傳遞,也可以使用f1()動態的創建
    <script type="text/javascript" src="https://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8&format=json&fields=word&word=百度"></script>
</head>
<body>
</body>
</html>

360響應的函數名是固定的,但是百度確是隨機的,所以就要用到jsonp了。
JSONP跨域的原理解析http://www.nowamagic.net/librarys/veda/detail/224
通過XMLHttpRequest實現的Ajax請求,不能向不同的域提交請求
jsonp:利用在頁面中創建<script>節點的方法向不同域提交HTTP請求的方法稱爲JSONP,這項技術可以解決跨域提交Ajax請求的問題。
JSONP的優點是
    它不像XMLHttpRequest對象實現的Ajax請求那樣受到同源策略的限制;
    它的兼容性更好,在更加古老的瀏覽器中都可以運行,不需要XMLHttpRequest或ActiveX的支持;
    並且在請求完畢後可以通過調用callback的方式回傳結果。
JSONP的缺點則是
    它只支持GET請求而不支持POST等其它類型的HTTP請求;
    它只支持跨域HTTP請求這種情況,不能解決不同域的兩個頁面之間如何進行JavaScript調用的問題。
原理
    首先在客戶端註冊一個callback (如:'jsoncallback'), 然後把callback的名字(如:jsonp1236827957501)傳給服務器。注意:服務端得到callback的數值後,要用jsonp1236827957501(......)把將要輸出的json內容包括起來,此時,服務器生成 json 數據才能被客戶端正確接收。
    然後以 javascript 語法的方式,生成一個function, function 名字就是傳遞上來的參數 'jsoncallback'的值 jsonp1236827957501 .
    最後將 json 數據直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。

//百度:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=js url後添加隨機數&cb=jQuery110204350759381847842_1507708570394&_=1507708570413
$.ajax({
    url:'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',
    jsonp:'cb',
    dataType:'jsonp',
    data:{
        wd:$(obj).val()
    },
    success:function(data){
        $('#content').html('');
        var msg = '';
        $.each(data.s,function (index,item) {
            msg += "<li>" + item + "</li>"
        });
        $('#content').html(msg);
        console.log(data)
    }
})

jsonp:設置callback的別名,默認是callback,
jsonpCallback:設置callback的值,url裏的callback='?'的?,默認自動生成jQuery隨機數

jsonp:只接收js響應的是name(data...)這種格式的數據,否則會能夠響應但是確不執行success的函數,出現parsererror:解析錯誤
如果傳遞的是個變量如:var info={data...},可以使用complete處理


跨域請求資源的方式
http://www.cnblogs.com/dojo-lzz/p/4265637.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章