2009-02-20 2 views
5

Привет всем, я работаю над виджетами для панели управления Apple, и у меня возникла проблема при попытке получить данные с моего сервера с помощью функции jjery ajax. Вот мой код Javascript:Dashboard Cross-domain AJAX с 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) 
}) 

И сервер отвечает этим JSON:

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

По какой-то причине, хотя, когда я запускаю это поля на виджет не изменится. Из отладки я узнал, что виджет даже не делает запрос на сервер, поэтому он заставляет меня думать, что у Apple есть какой-то внешний блок URL на месте. Я знаю, что это не может быть правдой, потому что многие виджеты дома по телефону проверяют наличие обновлений.

Есть ли у кого-нибудь идеи относительно того, что может быть неправильным?

EDIT: Кроме того, этот код отлично работает в Safari.


По просьбе Лука, вот PHP и Javascript код, который работает прямо сейчас:

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

ответ

7

В Dashcode нажмите Widget Атрибуты затем Разрешить доступ к сети убедитесь, что флажок установлен. Я построил что-то, что просто отказалось работать, и это было решением.

+0

Немного позже ответа, но это было сделано! –

-2

Интересно, что он работает в Safari , Насколько мне известно, для выполнения запросов ajax в x-domain вам нужно использовать jsonp dataType.

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

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

В основном вам нужно добавить callback=? в строку запроса и JQuery будет автоматически заменить его на правильный метод, например:

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

EDIT: поставить callback=? биту конец строки запроса, чтобы быть в безопасности.

4

Междоменные Ajax запросы (с помощью XMLHttpRequest/ActiveX объекта) не разрешено в текущем стандарте, в соответствии с W3C spec:

Эта спецификация не включает в себя следующих признаков, находящихся рассматриваемых для будущей версии :

  • Межсайтовый XMLHttpRequest;

Однако есть один метод сделать AJAX междоменное, JSONP, включив тег сценария на странице, и с небольшой конфигурации сервера.

JQuery поддерживает this, но вместо того, чтобы отвечать на запросы на сервер с этим

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

вы хотите ответить с этим:

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

myCallback должно быть значение в " callback ", который вы передали в функции $ .getJSON(). Так что, если я использую PHP, это будет работать:

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

Я попробовал добавить? Callback =? до конца URL-адреса, и я использовал этот точный PHP-код на сервере и все еще ничего. –

+0

Можем ли мы увидеть Javascript и PHP-код? Также есть консоль Javascript, выводящая какие-либо ошибки? –

+0

Там вы идете, и нет, dashcode ничего не сообщает в runlog. –

0

Если вы создаете виджет приборной панели, почему вы не используете функцию настройки XMLHttpRequest в коде библиотеки Dashcode. Apple построила их так, что вам не нужно устанавливать сторонние JS-библиотеки. Я не уверен в поддержке JSON, но, возможно, начало здесь приведет вас в лучшем направлении.

+0

Поскольку функции ajax jQuery используют 1 строку кода, значит, она выглядит лучше. –

4

У Apple есть какой-то внешний блок URL на месте.

В вашем Info.plist вам необходимо установить для ключа AllowNetworkAccess значение true.

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

Ваш код работает в Safari, так как он не ограничен в приборной панели разъединяет, и это не стандарты complient в том, что он позволяет кроссдоменного AJAX. Стандарты FF IS соответствуют тому, что он НЕ разрешает ajax для межсайтовых сайтов.

Смежные вопросы