JsonP 其實即係用 `script` Tag 來載入第三方 (不同 Domain) 的 javascript 檔案來取得資料,好處就係可以通過 Browser 的 CORS 的封鎖。 原理係通過由載入的 Javascript 檔案內容來直接 Call 你預先設定好的 Function。因為用 `script` Tag 載入的 Javascript 會直接執行。 ### 例子 你有一個 Html ```html <!-- 預備工作 --> <script type='text/javascript'> // 預先定義一個 function 來處理收到的資料 const myfnc = data => console.log(data); </script> <!-- 載入第三方 JS --> <script type='text/javascript' src='https://example.com/json.php?callback=myfnc'></script> ``` 而 Server 上有這個 PHP 檔案來 Handle 你個 Request ```php <?php // get callback name from url params $fncName = $_GET['callback']; // data $data = ["foo" => "bar", "apple" => "pen"]; // set javascript response header header('Content-Type: text/javascript; charset=utf-8'); // print result echo $fncName . "(" . json_encode($data) . ")"; ?> ``` 當你去 Request 呢個 PHP 時,大約就會得到以下的 Response body ```js myfnc({"foo":"bar","apple":"pen"}) ``` 咁當第三方 JS 載入完成後,就會立即自動 call 埋你預先寫好的 `myfnc` function 了。 ### 實際應用 當然實際上應用唔會好似上面咁揼死個 `script` tag 去載入,而一定係用 js 去插入一個 `script` tag 先有意義。 ```js // 設定一個 function function requestData() { // 開一個 script tag const s = document.createElement('script'); // 設定好路徑 s.src = 'https://example.com/json.php?callback=myfnc'; // 加入到 body 中 document.body.appendChild(s); } ``` 這樣就可以了。