문제

안녕하세요, Apple의 대시 보드를위한 위젯에서 작업하고 있으며 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에서 완벽하게 작동합니다.


Luca가 요청한대로 여기에 현재 실행중인 PHP 및 JavaScript 코드가 있습니다.

PHP :

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

자바 스크립트 :

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)
})
}
도움이 되었습니까?

해결책

대시 코드에서 클릭하십시오 위젯 속성 그 다음에 네트워크 액세스를 허용합니다 옵션이 확인되었는지 확인하십시오. 나는 단순히 일을 거부 한 것을 만들었고 이것이 해결책이었습니다.

다른 팁

크로스 도메인 AJAX 요청 (XMLHTTPREQUEST / ACTIOMX 객체 사용)은 현재 표준에서 허용되지 않습니다. W3C 사양:

이 사양에는이 사양의 향후 버전에 대해 고려되는 다음 기능이 포함되어 있지 않습니다.

  • 크로스 사이트 xmlhttprequest;

그러나 1 가지 기술이 있습니다 Ajax 크로스 도메인 요청, JSONP, 페이지에 스크립트 태그를 포함시키고 작은 서버 구성을 포함하여.

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"});';

Apple에는 외부 URL 블록이 있습니다.

귀하의 info.plist에서 Key allownetworkcess를 true로 설정해야합니다.

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

코드는 Safari에서 작동하여 대시 보드 왼쪽에서 제한되지 않기 때문에 크로스 사이트 Ajax를 허용한다는 점에서 정당한 표준이 아닙니다. FF는 크로스 사이트 Ajax를 허용하지 않는다는 점에서 만족하는 표준입니다.

대시 보드 위젯을 작성하는 경우 대시 코드의 코드 라이브러리에서 xmlhttprequest 설정 함수를 사용하지 않겠습니까? Apple은 이것을 구축하여 제 3 자 JS 라이브러리를 설치할 필요가 없습니다. JSON 지원에 대해 잘 모르겠지만 여기에서 시작하면 더 나은 방향으로 이끌 것입니다.

사파리에서 작동한다는 것이 흥미 롭습니다. 내가 아는 한 x-domain ajax 요청을 요청하면 JSONP 데이터 유형을 사용해야합니다.

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=? 안전하기 위해 쿼리 문자열의 끝을 비트.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top