Một cách tiếp cận tôi muốn sử dụng là đệm / bọc json bằng một đối tượng bằng chữ, và sau đó lưu tệp với phần mở rộng tệp .jsonp. Phương thức này cũng không thay đổi tệp json gốc (test.json) của bạn, vì bạn sẽ làm việc với tệp jsonp mới (test.jsonp) thay thế. Tên trên trình bao bọc có thể là bất cứ điều gì, nhưng nó cần phải cùng tên với chức năng gọi lại mà bạn sử dụng để xử lý jsonp. Tôi sẽ sử dụng test.json của bạn được đăng làm ví dụ để hiển thị bổ sung trình bao bọc jsonp cho tệp 'test.jsonp'.
json_callback({"a" : "b", "c" : "d"});
Tiếp theo, tạo một biến có thể sử dụng lại với phạm vi toàn cầu trong tập lệnh của bạn để giữ JSON được trả về. Điều này sẽ làm cho dữ liệu JSON được trả về có sẵn cho tất cả các chức năng khác trong tập lệnh của bạn thay vì chỉ có chức năng gọi lại.
var myJSON;
Tiếp đến là một chức năng đơn giản để lấy json của bạn bằng cách tiêm script. Lưu ý rằng chúng ta không thể sử dụng jQuery ở đây để nối tập lệnh vào đầu tài liệu, vì IE không hỗ trợ phương thức jQuery .append. Phương thức jQuery nhận xét trong đoạn mã dưới đây sẽ hoạt động trên các trình duyệt khác hỗ trợ phương thức .append. Nó được bao gồm như một tài liệu tham khảo để hiển thị sự khác biệt.
function getLocalJSON(json_url){
var json_script = document.createElement('script');
json_script.type = 'text/javascript';
json_script.src = json_url;
json_script.id = 'json_script';
document.getElementsByTagName('head')[0].appendChild(json_script);
// $('head')[0].append(json_script); DOES NOT WORK in IE (.append method not supported)
}
Tiếp theo là một hàm gọi lại ngắn và đơn giản (có cùng tên với trình bao bọc jsonp) để lấy dữ liệu kết quả json vào biến toàn cục.
function json_callback(response){
myJSON = response; // Clone response JSON to myJSON object
$('#json_script').remove(); // Remove json_script from the document
}
Bây giờ dữ liệu json có thể được truy cập bởi bất kỳ chức năng nào của tập lệnh bằng cách sử dụng ký hiệu dấu chấm. Ví dụ:
console.log(myJSON.a); // Outputs 'b' to console
console.log(myJSON.c); // Outputs 'd' to console
Phương pháp này có thể hơi khác so với những gì bạn đã từng thấy, nhưng có nhiều ưu điểm. Đầu tiên, cùng một tệp jsonp có thể được tải cục bộ hoặc từ một máy chủ sử dụng các chức năng tương tự. Như một phần thưởng, jsonp đã ở định dạng thân thiện giữa các miền và cũng có thể dễ dàng sử dụng với API loại REST.
Cấp, không có chức năng xử lý lỗi, nhưng tại sao bạn cần một chức năng? Nếu bạn không thể lấy dữ liệu json bằng phương pháp này, thì bạn có thể cá rằng bạn có một số vấn đề trong chính json và tôi sẽ kiểm tra nó trên trình xác nhận JSON tốt.
JSON
chuỗi bạn đã truy xuất một đối tượng javascript, không cần sử dụngeval()
.