天天看點

jsonp請求原生實作

jsonp原理

通過html中的script标簽的跨域能力實作與伺服器端的資料互動,解決ajax不能跨域的缺點。後端使用php程式設計,前端傳輸一個回調函數的名字,php中通過echo這個函數,可以實作在前端執行這個回調函數。

前端jsonp請求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        window.callback_jsonp = function (flag) {
            clearTimeout(window.jsonp_timer);
            console.log('請求成功');
        };
        // 3s逾時處理,避免伺服器端出錯
        window.jsonp_timer = setTimeout(function () {
            window.callback_jsonp = function () {
                console.log('jsonp請求逾時後傳回資料');
            };
            console.log('jsonp請求逾時');
        }, );
        var new_script = document.createElement('script');
        new_script.src = "//localhost/index.php?callback=window.callback_jsonp";
        document.body.appendChild(new_script);
        console.log('jsonp請求');
    </script>
</body>
</html>
           

伺服器端實作

<?php
    $data = true;
    $callback = $_GET['callback'];
    sleep();
    echo $callback.'('.json_encode($data).')';
?>
           

結果

  1. 首先輸出“jsonp請求”,說明請求是異步的,不會阻塞線程
  2. 然後輸出“jsonp請求逾時”,說明逾時處理有效
  3. 最後輸出“jsonp請求逾時後傳回資料”,說明可以通過重置回調函數避免逾時處理後,伺服器成功傳回資料,依然有回調函數中的代碼執行