2011-12-13 36 views
12

Tôi đang thực hiện yêu cầu JSONP trong tiện ích mở rộng của chrome (tập lệnh nội dung). Mọi thứ hoạt động rất tốt khi tôi chạy dưới dạng trang web tải tệp HTML trong trình duyệt của mình, nhưng khi tôi tải tệp đó dưới dạng tiện ích chrome, hàm gọi lại jsonp được tạo bởi jquery dường như không tồn tại khi máy chủ trả lời .Yêu cầu JSONP trong tiện ích chrome, chức năng gọi lại không tồn tại?

console của tôi nói:

Uncaught ReferenceError: jQuery17105683612572029233_1323808231542 is not defined 

Đây là yêu cầu ajax của tôi:

$.ajax({ 
    url: 'http://example.com', 
    data: 
    { 
     imgUrl: this.href, 
     returnString:true 
    }, 
    dataType: "jsonp", 
    success: function(msg){ 
     newNode.src = msg.data; 
    }, 
    error: function(msg){ 
     console.log(msg.data); 
    } 
}) 
+0

Để làm rõ, bạn đã thử nó bên ngoài tiện ích mở rộng chrome không có vấn đề gì? Bạn có chắc là bạn có quyền lưu trữ đối với URL bạn đang yêu cầu không? –

+0

Đúng, khi nó không phải là một phần mở rộng chrome - chỉ cần mở một trang web với các tập tin javascript bao gồm - nó hoạt động tốt. Tôi có lẽ nên đề cập đến đây là một kịch bản nội dung. –

+0

Chỉ cần xác minh tệp manifest.json của tôi và nó xuất hiện chính xác. Có cách nào để kiểm tra dứt khoát không? –

Trả lời

23

Vấn đề được rằng phản ứng JSONP đang được đánh bắt bởi các trang thực tế, bên ngoài của mã JavaScript sandboxed rằng tập lệnh nội dung Chrome cũng giới hạn bạn.

jQuery17105683612572029233_1323808231542 là tên của hàm gọi lại mà cuộc gọi JSONP của jQuery đã được tạo động cho cuộc gọi cụ thể. Chức năng này đang được xác định trong khu vực hộp cát mà tập lệnh nội dung có quyền truy cập.

Cách giải quyết duy nhất mà tôi biết, làm việc cho tôi, là thực hiện cuộc gọi XHR từ tập lệnh nội dung. Kể từ Chrome 13, bạn có thể làm cho XHR gọi tên miền chéo từ các tập lệnh nội dung (khá thú vị). Trong file manifest của bạn, bạn cần phải thêm URL bên ngoài để các điều khoản:

{ 
    ... 
    "permissions": [ 
     "http://example.com" 
    ] 
} 

Sau đó, bạn có thể thực hiện cuộc gọi XHR như vậy:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://example.com/", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     //handle the xhr response here 
    } 
} 
xhr.send(); 

Bạn sẽ cần phải làm một số trong những điều mà jQuery đã làm tự động cho bạn, như mã hóa các giá trị của đối tượng dữ liệu vào URL XHR (trong trường hợp của bạn là "imrUrl" và "returnString") cũng như chuyển đổi phản hồi từ xhr.responeText hoặc xhr.reponseXML thành một đối tượng.

Nhược điểm của phương pháp này là nếu bạn đang chia sẻ mã này giữa tiện ích mở rộng của Chrome và một thứ khác (như dấu trang), bạn phải có logic khác nhau cho trường hợp sử dụng Chrome.

Để biết thêm thông tin, hãy xem: Chrome Extension XHR

+4

Giải thích tuyệt vời. Tôi cũng sẽ thêm rằng khi bạn thiết lập quyền trong tệp kê khai, bạn có thể quay lại sử dụng jQuery AJAX với JSON thay vì JSONP và nó sẽ hoạt động. – ron

+0

Tôi khuyên bạn nên thêm nội dung nhận xét của @ ron vào phần nội dung câu trả lời. –

Các vấn đề liên quan