JavaScript - 原生Jsonp及封裝

前言:

本文是建立在了解jsonp的基礎(chǔ)上的,不了解jsonp的小伙伴可以先百度哦。使用Vue的小伙伴想用jsonp可以看看我之前寫的文章 傳送門

原生jsonp封裝思路:
  • 隨機(jī)生成callback名
  • 動(dòng)態(tài)生成script
  • 根據(jù)傳入的params對(duì)象拼接字符串,得到完整的url
  • 把url賦給生成的script,同時(shí)把script掛載到頁面上
  • 通過window屬性的方法獲取jsonp結(jié)果,調(diào)用success回調(diào)函數(shù)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <script>
            function jsonp({url,params={},success}){
                // 根據(jù)時(shí)間戳生成一個(gè)callback名
                let callbackName = `jsonp_${new Date().getTime()}`;

                // 創(chuàng)建script
                let script = document.createElement('script');

                // 字符串拼接生成基本url
                let baseUrl = `${url}?callback=${callbackName}`;

                // 取出params對(duì)象屬性并得到完整url
                for(let item in params){
                    baseUrl += `&${item}=${params[item]}`;
                }

                // jsonp核心,通過script的跨域特性發(fā)出請(qǐng)求
                script.src = baseUrl;

                // 把創(chuàng)建的script掛載到DOM
                document.body.appendChild(script);

                // 給window添加屬性,用于獲取jsonp結(jié)果
                window[callbackName] = (res)=>{
                    // 執(zhí)行success回調(diào)
                    success(res);
                    // 刪除window下屬性
                    delete window[callbackName];
                    // 得到結(jié)果后刪除創(chuàng)建的script
                    document.body.removeChild(script);
                }

            }
            jsonp({
                url:'http://192.168.191.1:8000/bookIfoTotal',
                params:{
                    name:'tom',
                    age:21
                },
                success(res){
                    console.log(res);
                }
            })
        </script>
    </body>
</html>

總結(jié):jsonp作為跨域的一種方法還是比較簡單實(shí)用的,雖然只支持get方式,但是用于查詢數(shù)據(jù)已經(jīng)足夠了。

附上測試結(jié)果:


jsonp
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 同源策略 瀏覽器對(duì)不同源的腳本或者文本的訪問方式進(jìn)行的限制,就是一種瀏覽器的安全機(jī)制。 同源:相同的協(xié)議、域名、端...
    Mr無愧于心閱讀 1,046評(píng)論 0 1
  • ajax是什么: ajax簡單的說就是做數(shù)據(jù)交互使用的。 Ajax的原理簡單來說通過XmlHttpRequest對(duì)...
    liudai123閱讀 457評(píng)論 0 0
  • Ajax 模塊也是經(jīng)常會(huì)用到的模塊,Ajax 模塊中包含了 jsonp 的現(xiàn)實(shí),和 XMLHttpRequest ...
    對(duì)角另一面閱讀 661評(píng)論 0 1
  • JSONP的誕生 1.首先,因?yàn)閍jax無法跨域,然后開發(fā)者就有所思考 2.其次,開發(fā)者發(fā)現(xiàn),script標(biāo)簽的s...
    heachou閱讀 547評(píng)論 0 0
  • 人先天皆有不足,唯有后天多愛自己! 單純延長睡眠時(shí)間是不能緩解疲勞改善精力的,甚至對(duì)身體有壞處。 傷脾氣。久臥會(huì)傷...
    后愛書杭閱讀 431評(píng)論 1 0

友情鏈接更多精彩內(nèi)容