JSONP
- Trang trước HTML JSON
- Trang tiếp theo Chọn器 jQuery
JSONP 是一种无需考虑跨域问题即可传送 JSON 数据的方法。
JSONP 不使用 XMLHttpRequest 对象。
JSONP 使用 <script>
标签取而代之。
JSONP 简介
JSONP 指的是 JSON with Padding。
从另一个域请求文件会引起问题,由于跨域政策。
从另一个域请求外部脚本没有这个问题。
JSONP 利用了这个优势,并使用 script 标签替代 XMLHttpRequest 对象。
<script src="demo_jsonp.php">
Server 文件
服务器上的文件在函数调用中封装结果:
Mẫu
<?php $myJSON = '{ "name":"Bill Gates", "age":62, "city":"Seattle" }'; echo "myFunc(".$myJSON.");"; ?>
Kết quả trả về là cuộc gọi hàm "myFunc" với dữ liệu JSON làm tham số.
Hãy đảm bảo rằng hàm này tồn tại tại client.
Hàm của JavaScript
Hàm "myFunc" nằm tại client, được sử dụng để xử lý dữ liệu JSON:
Mẫu
function myFunc(myObj) { document.getElementById("demo").innerHTML = myObj.name; }
Tạo thẻ script động
Ví dụ trên sẽ thực hiện hàm "myFunc" khi trang được tải, điều này không thực sự hài lòng nếu bạn đặt thẻ script ở vị trí khác.
Script chỉ nên được tạo khi cần thiết:
Mẫu
Tạo và chèn thẻ <script> khi nút được nhấn:
function clickButton() { var s = document.createElement("script"); s.src = "demo_jsonp.php"; document.body.appendChild(s); }
Kết quả JSONP động
Ví dụ trên vẫn là tĩnh.
Bạn có thể tạo ví dụ động bằng cách gửi JSON đến tệp PHP, sau đó trả về một đối tượng JSON dựa trên thông tin từ tệp php này.
Tệp PHP
<?php header("Content-Type: application/json; charset=UTF-8"); $obj = json_decode($_GET["x"], false); $conn = new mysqli("myServer", "myUser", "myPassword", "Northwind"); $result = $conn->query("SELECT name FROM ".$obj->$table." LIMIT ".$obj->$limit); $outp = array(); $outp = $result->fetch_all(MYSQLI_ASSOC); echo "myFunc(".json_encode($outp).")"; ?>
Giải thích tệp PHP:
- Chuyển đổi yêu cầu thành đối tượng, sử dụng hàm PHP
json_decode()
. - Truy cập cơ sở dữ liệu và sử dụng dữ liệu được yêu cầu để điền vào mảng.
- Thêm mảng vào đối tượng.
- Sử dụng
json_decode()
Hàm chuyển đổi mảng thành JSON. - Bao bọc đối tượng trả về bằng "myFunc()".
Mẫu JavaScript
Sẽ gọi hàm "myFunc" từ tệp php:
function clickButton() { var obj, s obj = { "table":"products", "limit":10 }; s = document.createElement("script"); s.src = "jsonp_demo_db.php?x=" + JSON.stringify(obj); document.body.appendChild(s); } function myFunc(myObj) { var x, txt = ""; for (x in myObj) { txt += myObj[x].name + "<br>"; } document.getElementById("demo").innerHTML = txt; }
Hàm回调
Nếu bạn không thể kiểm soát tệp máy chủ, thì làm thế nào để tệp máy chủ gọi đúng hàm?
Đôi khi tệp máy chủ cung cấp hàm回调 như tham số:
Mẫu
Tệp PHP sẽ gọi hàm mà bạn truyền qua tham số回调:
function clickButton() { var s = document.createElement("script"); s.src = "jsonp_demo_db.php?callback=myDisplayFunction"; document.body.appendChild(s); }
- Trang trước HTML JSON
- Trang tiếp theo Chọn器 jQuery