2009-02-20 25 views
5

Chào mọi người, tôi đang làm việc trên một widget cho Bảng điều khiển của Apple và tôi đã gặp sự cố khi cố gắng lấy dữ liệu từ máy chủ của tôi bằng chức năng ajax của jquery. Dưới đây là mã javascript của tôi:Bảng điều khiển Cross-domain AJAX với jquery

$.getJSON("http://example.com/getData.php?act=data",function(json) { 
    $("#devMessage").html(json.message) 
    if(json.version != version) { 
     $("#latestVersion").css("color","red") 
    } 
    $("#latestVersion").html(json.version) 
}) 

Và server trả lời với json này:

{"message":"Hello World","version":"1.0"} 

Đối với một số lý do, mặc dù khi tôi chạy các lĩnh vực trên widget không thay đổi. Từ gỡ rối, tôi đã học được rằng các widget thậm chí không thực hiện các yêu cầu đến máy chủ, do đó, nó làm cho tôi nghĩ rằng Apple có một số loại khối URL bên ngoài tại chỗ. Tôi biết điều này không thể đúng mặc dù, bởi vì nhiều vật dụng điện thoại nhà để kiểm tra các bản cập nhật.

Có ai có bất kỳ ý tưởng nào về những gì có thể sai không?

EDIT: Ngoài ra, mã này hoạt động hoàn toàn tốt trong Safari.


Theo yêu cầu của Luca, đây là PHP và mã Javascript đang chạy ngay bây giờ:

PHP:

echo $_GET["callback"].'({"message":"Hello World","version":"1.0"});'; 

Javascript:

function showBack(event) 
{ 
var front = document.getElementById("front"); 
var back = document.getElementById("back"); 

if (window.widget) { 
    widget.prepareForTransition("ToBack"); 
} 

front.style.display = "none"; 
back.style.display = "block"; 
stopTime(); 
if (window.widget) { 
    setTimeout('widget.performTransition();', 0); 
} 
$.getJSON('http://nakedsteve.com/data/the-button.php?callback=?',function(json) { 
    $("#devMessage").html(json.message) 
    if(json.version != version) { 
     $("#latestVersion").css("color","red") 
    } 
    $("#latestVersion").html(json.version) 
}) 
} 

Trả lời

7

Trong Dashcode, hãy nhấp vào Thuộc tính tiện ích sau đó Cho phép tùy chọn mạng được kiểm tra. Tôi đã xây dựng một cái gì đó mà chỉ đơn giản là từ chối làm việc, và đây là giải pháp.

+0

Một chút muộn của một phản ứng, nhưng điều đó đã làm nó! –

-2

Thú vị rằng nó hoạt động trong Safari . Theo như tôi biết để thực hiện yêu cầu ajax miền x, bạn cần sử dụng dataType jsonp.

http://docs.jquery.com/Ajax/jQuery.getJSON

http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/

Về cơ bản bạn cần phải thêm callback=? chuỗi truy vấn của bạn và jquery sẽ tự động thay thế bằng phương pháp đúng ví dụ:

$.getJSON("http://example.com/getData.php?act=data&callback=?",function(){ ... }); 

EDIT: đặt các bit callback=? tại cuối chuỗi truy vấn chỉ để an toàn.

4

yêu cầu Ajax chéo miền (Sử dụng XMLHttpRequest/ActiveX object) không được phép vào các tiêu chuẩn hiện hành, theo W3C spec:

đặc điểm kỹ thuật này không bao gồm các tính năng sau đó đang được coi cho một phiên bản tương lai của đặc điểm kỹ thuật này:

  • Cross-site XMLHttpRequest;

Tuy nhiên có 1 kỹ thuật làm ajax yêu cầu cross-domain, JSONP, bằng cách bao gồm một thẻ script trên trang, và với một cấu hình máy chủ ít.

jQuery hỗ trợ this, nhưng thay vì đáp ứng trên máy chủ của bạn với điều này

{"message":"Hello World","version":"1.0"} 

bạn sẽ muốn để đáp ứng với điều này:

myCallback({"message":"Hello World","version":"1.0"}); 

myCallBack phải là giá trị trong " gọi lại "tham số bạn đã truyền trong hàm $ .getJSON(). Vì vậy, nếu tôi đang sử dụng PHP, điều này sẽ làm việc:

echo $_GET["callback"].'({"message":"Hello World","version":"1.0"});'; 
+0

Tôi đã thử thêm? Callback =? đến cuối url và tôi đã sử dụng mã PHP chính xác đó trên máy chủ và vẫn không có gì. –

+0

Chúng ta có thể thấy Javascript và mã PHP không? Ngoài ra, giao diện điều khiển Javascript có xuất hiện bất kỳ lỗi nào không? –

+0

Có bạn đi, và không có, dashcode không báo cáo bất cứ điều gì trong runlog. –

0

Nếu bạn đang tạo một widget bảng điều khiển, tại sao bạn không sử dụng chức năng XMLHttpRequest Setup trong thư viện mã của Dashcode. Apple đã tạo những thứ này để bạn không cần phải cài đặt các thư viện JS của bên thứ ba. Tôi không chắc về hỗ trợ JSON nhưng có lẽ bắt đầu từ đây sẽ dẫn bạn đi theo hướng tốt hơn.

+0

Bởi vì chức năng ajax của jQuery sử dụng 1 dòng mã, vì vậy nó trông đẹp hơn. –

4

Apple có một số loại URL chặn bên ngoài tại chỗ.

Trong Info.plist của bạn, bạn cần phải đặt khóa AllowNetworkAccess thành true.

<key>allowNetworkAccess</key> 
<true/> 

Mã của bạn hoạt động trong Safari vì nó không bị ràng buộc trong bảng điều khiển và không tuân thủ các tiêu chuẩn ở chỗ nó cho phép AJAX chéo trang. Các tiêu chuẩn FF IS tuân thủ ở chỗ nó KHÔNG cho phép ajax cross site.

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