Панель инструментов Междоменный AJAX с jquery - PullRequest
5 голосов
/ 20 февраля 2009

Привет всем, я работаю над виджетом для Apple Dashboard и столкнулся с проблемой при попытке получить данные с моего сервера с помощью функции jquery ajax. Вот мой код JavaScript:

$.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-адресов. Я знаю, что это не может быть правдой, потому что многие виджеты звонят домой, чтобы проверить наличие обновлений.

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

РЕДАКТИРОВАТЬ: Кроме того, этот код прекрасно работает в 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)
})
}

Ответы [ 5 ]

7 голосов
/ 19 мая 2009

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

4 голосов
/ 04 мая 2009

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

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

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

Ваш код работает в Safari, поскольку он не ограничен в сервере панелей мониторинга и не соответствует стандартам, так как он разрешает межсайтовый AJAX. Стандарты FF IS совместимы, так как не допускают межсайтовый AJAX.

4 голосов
/ 20 февраля 2009

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

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

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

Однако есть 1 метод выполнения ajax запросов к междоменной области, JSONP , путем включения тега script на странице и небольшой настройки сервера.

jQuery поддерживает это , но вместо ответа на вашем сервере с этим

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

вы захотите ответить так:

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

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

echo $_GET["callback"].'({"message":"Hello World","version":"1.0"});';
0 голосов
/ 20 февраля 2009

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

0 голосов
/ 20 февраля 2009

Интересно, что это работает в 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(){ ... });

РЕДАКТИРОВАТЬ: поставить бит callback=? в конце строки запроса, чтобы быть в безопасности.

...