三種方式使用 jsonp 實現(xiàn)跨域

之前一直不了解 jsonp 是怎么使用的娇斩,工作之余研究了一下夹囚,常用的三種方式纵刘。

  • 原生 js
  • jQuery
  • vue

注意: jsonp 只能是 get 請求;

一荸哟、 使用原生 js 實現(xiàn) jsonp 跨域

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>原生js中jsonp請求</title>
</head>

<body>
<div id="box">
    <input type="text" placeholder="請輸入搜索內(nèi)容" id="input" onchange="changeValFn(this)">
    <p id="text"></p>
</div>
<script type="text/javascript">
    var boxEl = document.getElementById('box')
    var textEl = document.getElementById('text')
  //  script 標簽中 src 加載的資源假哎,服務(wù)端返回的一個方法瞬捕,方法傳的參數(shù)就是需要的數(shù)據(jù)
    function cbFn(data){
      console.log('回調(diào)'+JSON.stringify(data));
      textEl.innerText = JSON.stringify(data)
    }
// input 值改變
  function changeValFn(ev){
      var data = ev.value
    var scriptEl = document.createElement('script')
    console.log('ev_'+ev.value);
    scriptEl.src = 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd='+data+'&cb=cbFn'
    boxEl.appendChild(scriptEl)
  }
</script>
</body>
</html>

步驟:

  • 監(jiān)聽input 輸入框的值改變;
  • 創(chuàng)建script 標簽舵抹,設(shè)置 src 的指向肪虎,其中 wd的值是請求的參數(shù),cb的值 是設(shè)置的回調(diào)函數(shù)名稱惧蛹;
  • 將 script 標簽插入到 DOM 中扇救;
  • 請求成功后cbFn會執(zhí)行,數(shù)據(jù)成功打酉闵ぁ迅腔;

二、 使用jQuery 實現(xiàn) jsonp 跨域

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>jQuery ajax jsonp 請求</title>
</head>
<body>
<div id="box">
    <input type="text" placeholder="請輸入搜索內(nèi)容" id="input">
    <p id="text"></p>
</div>
<script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
<script>
  $(document).ready(function () {
    $('#input').on('change', function () {
      var data = $(this).val()
      $.ajax({
        url: 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',
        type: 'GET',
        data: {wd: data},
        dataType: 'jsonp',  //指定服務(wù)器返回的數(shù)據(jù)類型
        jsonp: 'cb', // 傳遞給請求處理程序或頁面的靠娱,用以獲得jsonp回調(diào)函數(shù)名的參數(shù)名(默認為:callback)
        jsonpCallback: 'sug',  //指定回調(diào)函數(shù)名稱
        success: function (data) {
          console.log(data)
          var result = JSON.stringify(data) //json對象轉(zhuǎn)成字符串
          $('#text').text(result)
        },
        error:function (error) {
          console.log(error)
        }
      })
    })
  })
</script>
</body>
</html>


步驟:

  • 監(jiān)聽 input 值改變沧烈;
  • 使用 jQuery發(fā)送 Ajax 請求
  • 返回渲染數(shù)據(jù)

三、 使用vue 實現(xiàn) jsonp 跨域

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Vue jsonp 請求</title>
    <script src="https://cdn.bootcss.com/vue/2.1.7/vue.min.js"></script>
    <script src="https://cdn.bootcss.com/vue-resource/1.3.1/vue-resource.min.js"></script>
</head>
<body>
<div id="box">
    <input type="text" placeholder="請輸入搜索內(nèi)容" v-model='inputText'>
    <ul>
        <li v-if="result" v-for="(item, index) in result">
            {{item}}
        </li>
    </ul>
</div>
<script type="text/javascript">
  window.onload = function () {
    new Vue({
      el: '#box',
      data: {
        inputText: '',
        text: '',
        nowIndex: -1,
        result: []
      },
      watch:{
        inputText:function (newVal) {
          const that = this
          if(!newVal){
            that.result = []
            return false
          }
          that.getData()
        }
      },
      methods: {
        getData: function() {
          const that = this
          that.$http.jsonp('https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su', {
            params: {
              wd: that.inputText
            },
            jsonp: 'cb'
          }).then(function (value) {
            that.result = value
          })
        }
      }
    })
  }
</script>
</body>
</html>

步驟:

  • watch 監(jiān)聽input 的值改變像云,發(fā)送請求掺出。
  • 返回數(shù)據(jù)渲染;

OK 大功告成苫费!
github源碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汤锨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子百框,更是在濱河造成了極大的恐慌闲礼,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铐维,死亡現(xiàn)場離奇詭異柬泽,居然都是意外死亡,警方通過查閱死者的電腦和手機嫁蛇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門锨并,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人睬棚,你說我怎么就攤上這事第煮。” “怎么了抑党?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵包警,是天一觀的道長。 經(jīng)常有香客問我底靠,道長害晦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任暑中,我火速辦了婚禮壹瘟,結(jié)果婚禮上鲫剿,老公的妹妹穿的比我還像新娘。我一直安慰自己稻轨,他們只是感情好灵莲,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澄者,像睡著了一般。 火紅的嫁衣襯著肌膚如雪请琳。 梳的紋絲不亂的頭發(fā)上粱挡,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天,我揣著相機與錄音俄精,去河邊找鬼询筏。 笑死,一個胖子當著我的面吹牛竖慧,可吹牛的內(nèi)容都是我干的嫌套。 我是一名探鬼主播,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼圾旨,長吁一口氣:“原來是場噩夢啊……” “哼踱讨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起砍的,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤痹筛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后廓鞠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帚稠,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年床佳,在試婚紗的時候發(fā)現(xiàn)自己被綠了滋早。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡砌们,死狀恐怖杆麸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浪感,我是刑警寧澤角溃,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站篮撑,受9級特大地震影響减细,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赢笨,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一未蝌、第九天 我趴在偏房一處隱蔽的房頂上張望驮吱。 院中可真熱鬧,春花似錦萧吠、人聲如沸左冬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拇砰。三九已至,卻和暖如春狰腌,著一層夾襖步出監(jiān)牢的瞬間除破,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工琼腔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瑰枫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓丹莲,卻偏偏與公主長得像光坝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甥材,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349

推薦閱讀更多精彩內(nèi)容