1. 程式人生 > 遊戲 >人氣頗高 《英雄不再3》實體收藏版已被搶購一空

人氣頗高 《英雄不再3》實體收藏版已被搶購一空

  • JSONP是一個非官方的跨域解決方案,純粹憑藉程式設計師的聰明才智開發出來,只支援get請求
  • 工作方式:在網頁有一些標籤天生具有跨域能力:img、link、iframe、script;JSONP就是利用script標籤的跨域能力來發送請求的

8.3.1. 原理

.html

  • response.end()返回的結果是函式呼叫,函式的引數是想給客戶端返回結果的資料,函式必須在前端頁面提前宣告,(前端頁面的函式對返回過去的資料進行處理)
  • script標籤中引用url
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>原理演示</title>
  <style>
    #result {
      width: 300px;
      height: 120px;
      border: 1px solid #409EFF;
    }
  </style>
</head>

<body>
  <div id="result"></div>
  <script>
    //處理資料
    function handle(data) {
      //獲取result元素
      const result = document.getElementById("result");
      result.innerHTML = data.name;
    }
  </script>
  <!-- <script src="http://127.0.0.1:8848/HBuilderProjects/ajax/%E8%B7%A8%E5%9F%9F/JSONP/js/app.js"></script> -->
  <script src="http://127.0.0.1:8000/jsonp-server"></script>
</body>

</html>

server.js

//原理:返回的結果是函式呼叫,函式的引數是想給客戶端返回結果的資料
//函式要在前端頁面提前宣告(前端函式對返回過去的資料進行處理)
app.all('/jsonp-server', (request, response) => {
  const data = {
    name: 'phy'
  };
  //將資料轉化成字串
  let str = JSON.stringify(data);
  //返回結果
  response.end(`handle(${str})`);
})

8.3.2. JSONP實踐

.html

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>案例</title>
</head>

<body>
  使用者名稱:<input type="text" id="username" />
  <p></p>
  <script>
    //獲取元素
    const input = document.getElementById("username");
    const p = document.querySelector('p');
    //宣告handle函式
    function handle(data) {
      input.style.border = "solid 1px #f00";
      p.innerHTML = data.msg;
    }

    //失去焦點事件
    input.onblur = function () {
      let username = this.value;
      //向服務端傳送請求,檢測使用者名稱是否存在
      //1、建立script標籤
      const script = document.createElement('script');
      //2、設定標籤的src屬性
      script.src = 'http://127.0.0.1:8000/check-username';
      //3、將script插入到文件中
      document.body.appendChild(script);
    }
  </script>
</body>

</html>

server.js

//檢測使用者名稱是否存在
app.all('/check-username', (request, response) => {
  const data = {
    exist: 1,
    msg: '使用者名稱已經存在'
  };
  //將資料轉化成字串
  let str = JSON.stringify(data);
  //返回結果
  response.end(`handle(${str})`);
})

8.3.3. jQuery-jsonp

.html

  • url後需加?callback=?固定寫法
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>jQuery-jsonp</title>
  <style>
    #result {
      width: 300px;
      height: 100px;
      border: solid 1px #089;
    }
  </style>
  <script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>

<body>
  <!-- 210323 -->
  <button>點擊發送jsonp請求</button>
  <div id="result">

  </div>
  <script>
    $('button').eq(0).click(function () {
      //url後需加?callback=?固定寫法
      $.getJSON('http://127.0.0.1:8000/jquery-jsonp-server?callback=?', function (data) {
        $('#result').html(`
						名稱:${data.name},<br>
						校區:${data.city}
					`)
      })
    })
  </script>
</body>

</html>

server.js

//jQuery-jsonp
app.all('/jquery-jsonp-server', (request, response) => {
  const data = {
    name: 'jscksmk',
    city: ['北京', '上海', '杭州']
  };
  //將資料轉化成字串
  let str = JSON.stringify(data);
  //接收callback引數
  let cb = request.query.callback;
  //返回結果
  response.end(`${cb}(${str})`);
})