2009-02-20 19 views
5

Hej wszystkim, pracuję nad widgetem dla Dashboard firmy Apple i napotkałem problem podczas próby pobrania danych z mojego serwera przy użyciu funkcji ajax jquery. Oto mój kod javascript:Dedykacja między domenami AJAX z 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) 
}) 

a serwer odpowiada tym json:

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

Z jakiegoś powodu jednak, gdy ten pola na widget nie zmieni. Po debugowaniu dowiedziałem się, że widget nie wysyła żądania do serwera, więc wydaje mi się, że Apple ma jakiś blok zewnętrznego adresu URL. Wiem, że to nie może być prawda, ponieważ wiele widżetów telefonuje do domu, aby sprawdzić dostępność aktualizacji.

Czy ktoś ma jakieś pomysły na temat tego, co może być nie tak?

EDYCJA: Ten kod działa również doskonale w Safari.


Zgodnie z wnioskiem Luca, oto PHP i kod JavaScript, który jest uruchomiony teraz:

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) 
}) 
} 

Odpowiedz

7

W kodzie Dashcode kliknij Widget Atrybuty następnie Zezwalaj na dostęp do sieci upewnij się, że opcja jest zaznaczona. Zbudowałem coś, co po prostu odmówiło pracy, i to było rozwiązanie.

+0

Trochę za późno, ale tak się stało! –

-2

Ciekawe, że to działa w Safari . O ile wiem, aby wykonać żądania ajax ajax x-domain, musisz użyć jsonp dataType.

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

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

Zasadniczo trzeba dodać callback=? do łańcucha zapytania i jQuery automatycznie zastąpić ją metodą prawidłowego np

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

EDIT: umieścić callback=? trochę na koniec ciągu zapytania, aby być bezpiecznym.

4

Trasy domen Ajax żądania (z zastosowaniem XMLHttpRequest/obiekt ActiveX) nie jest dozwolone w obecnym standardzie, jak na W3C spec:

Ten opis nie zawiera następującymi cechami, które są rozważanych dla przyszłej wersji ta specyfikacja:

  • Cross-site XMLHttpRequest;

Jednak istnieje 1 technika robi Ajax żądań między domenami, JSONP, włączając tag skryptu na stronie, a przy odrobinie konfiguracji serwera.

jQuery obsługuje this, ale zamiast odpowiadać na serwerze z tym

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

będziemy chcieli odpowiedzieć następująco:

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

mycallback musi być wartość w polu " parametr zwrotny "przekazany w funkcji $ .getJSON(). Więc gdybym był przy użyciu PHP, to będzie działać:

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

Próbowałem dodać? Callback =? na końcu adresu URL, a ja użyłem tego dokładnego kodu PHP na serwerze i nadal nic. –

+0

Czy możemy zobaczyć kod JavaScript i kod PHP? Czy konsola JavaScript wypuszcza także jakieś błędy? –

+0

Idź i nie, dashcode nie zgłasza niczego w dzienniku. –

0

Jeśli tworzysz widget desce rozdzielczej, dlaczego nie można korzystać z funkcji XMLHttpRequest konfiguracji w bibliotece kodu Dashcode. Apple je zbudował, więc nie musisz instalować bibliotek JS stron trzecich. Nie jestem pewien co do wsparcia JSON, ale może rozpoczęcie tutaj poprowadzi cię w lepszym kierunku.

+0

Ponieważ funkcje ajax jQuery za pomocą 1 linii kodu, więc wygląda lepiej. –

4

Apple ma blok zewnętrznego adresu URL.

Na liście Info.plist należy ustawić klucz AllowNetworkAccess na wartość true.

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

Twój kod działa w Safari, ponieważ nie jest ograniczany w sever desce rozdzielczej i nie jest standardy complient tym, że zezwala cross site AJAX. Standardy FF IS są zgodne z tym, że NIE zezwalają na krzyżowy ajax.

Powiązane problemy