jsonp的優缺點


轉載:http://www.w3cfuns.com/notes/18271/df9ecd8f0ca5e523ae75745a3996c47c.html

JSONP的優缺點
        1.優點
                1.1它不像XMLHttpRequest對象實現的Ajax請求那樣受到同源策略的限制,JSONP可以跨越同源策略;
                1.2它的兼容性更好,在更加古老的瀏覽器中都可以運行,不需要XMLHttpRequest或ActiveX的支持
                1.3在請求完畢后可以通過調用callback的方式回傳結果。將回調方法的權限給了調用方。這個就相當於將controller層和view層終於分開了。我提供的jsonp服務只提供純服務的數據,至於提供服務以 后的頁面渲染和后續view操作都由調用者來自己定義就好了。如果有兩個頁面需要渲染同一份數據,你們只需要有不同的渲染邏輯就可以了,邏輯都可以使用同 一個jsonp服務。
        2.缺點
                2.1它只支持GET請求而不支持POST等其它類型的HTTP請求
                2.2它只支持跨域HTTP請求這種情況,不能解決不同域的兩個頁面之間如何進行JavaScript調用的問題。
                2.3 jsonp在調用失敗的時候不會返回各種HTTP狀態碼。
                2.4缺點是安全性。萬一假如提供jsonp的服務存在頁面注入漏洞,即它返回的javascript的內容被人控制的。那么結果是什么?所有調用這個 jsonp的網站都會存在漏洞。於是無法把危險控制在一個域名下…所以在使用jsonp的時候必須要保證使用的jsonp服務必須是安全可信的。

================================================

jquery的$.get $.post $.ajax $.getJSON.

轉載:http://www.cnblogs.com/ranzige/p/jquery_get_ajax.html

轉載:http://www.jb51.net/article/77470.htm

$.getJSON 的本質是$.get+一個json的參數,get請求才可以跨域。

$.ajax對原聲 ajax的一個封裝,支持get和post,也可以跨域

================================================

我們通常用的getJSON的用法。

getJSON: function(param) {
            var url = param.url,
                data = param.data,
                success = param.success,
                fail = param.fail,
                callback = param.callback || 'callback',
                timeout = param.timeout || 5000,
                maxCount = param.maxCount || 2;

            var jsonpCallback,
                count = -1,
                delayID = 0,
                s,
                self = this,
                head = document.head || document.getElementsByTagName('head')[0] || document.documentElement;

            var tmp = [];

            if(data) for(var k in data) tmp.push(k + '=' + data[k]);

            if(!/\?/.test(url)){
                url += '?' + tmp.join('&');
            }else{
                url += '&' + tmp.join('&');
            }

            var addCb = function(){
                var time = self.now(),
                    jsonpCallback = 'vjs_' + time + Math.floor(Math.random()*100);

                window[jsonpCallback] = function(response) {
                    destroy();

                    success.call(this, response,{responseTime: self.now()-time, retryCount: count});

                    window[jsonpCallback] = null;
                };

                return jsonpCallback;
            };

            var destroy = function(){
                if(window[jsonpCallback])  window[jsonpCallback] = emptyFn;
                clearTimeout(delayID);

                if (s && s.parentNode) {
                    head.removeChild(s);

                    s.onload = s.onreadystatechange = null;

                    s = undefined;
                }
            };

            var load = function() {
                destroy();
                count++;
                if (count >= maxCount){
                    fail && fail.call(this);
                    return;
                }

                jsonpCallback = addCb();

                var jsonpUrl = url;

                if(/(\=)\?(&|$)/i.test(jsonpUrl)){
                    jsonpUrl = jsonpUrl.replace(/(\=)\?(&|$)/i,'$1' + jsonpCallback + '$2');
                }else{
                    jsonpUrl += '&' + callback + '=' + jsonpCallback;
                }

                if(param.log) param.log.pushLog('lib getJSON===' + jsonpUrl + '===' + jsonpCallback + '====' + count);
                s = document.createElement('script');
                s.setAttribute('type', 'text/javascript');
                s.setAttribute('src', jsonpUrl);

                head.insertBefore(s, head.firstChild);

                delayID = setTimeout(load, timeout);
            };

            load();

            return {
                destroy : destroy
            }
        }

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM