Erro: jQuery1830649454693285679_1359620502896 não foi chamado de JSON

Eu leio muitas perguntas e respostas da mesma questão, mas nenhuma tem minha questão específica (pelo menos não que eu possa encontrar).

Eu tenho um script php que ecoa uma string json

header('Content-Type: application/json'); echo $result; 

JSON retornou (verificado com JSONLint e é válido):

 {"Announcement":{"ID":1,"Type":1,"Text":"This is a test Albums announcement.","TimeStart":"1969-12-31","TimeEnd":"1969-12-31"}} 

E um script da web jquery que lê o json:

 $.ajax({ type : "GET", url : "http://b***s.net/S****s/GetAnnouncements.php?callback=?", data : {get_param : "Announcement"}, dataType : "json", error : function(jqXHR, textStatus, errorThrown) {alert(errorThrown); alert(textStatus);}, success : function(data) {alert('success'); $.each(data, function(index, element) { alert('here'); $("#announcements-list").append("
  • " + element.Type + ": " + element.Text + "

  • "); $("#announcements-a-" + element.ID).bind('click', function() {Announcements.AnnouncementID = element.ID;}); }); $("#announcements-list").listview('refresh'); } });

    success: nunca é chamado. E error: retorna um textStatus de "parsererror" e errorThrown é "Error: jQuery1830649454693285679_1359620502896 was not called"

    • Eu adicionei callback=? para o url para trabalhar em torno da questão de domínio cruzado.
    • Eu enviei o header('Content-Type: application/json'); para o php, e ele retorna NO html.
    • Verifiquei a validade do JSON com JSONLint
    • Eu tentei remover os data: "json" como dizem algumas respostas, mas isso ainda retorna um parsererror
    • Usando jQuery 1.8.3

    Os scripts de servidor e cliente não se complementam. Você tem duas opções:


    Faça o retorno do script do lado do servidor JSON:

     Content-Type: application/json {"Announcement":{"ID":1}} 

    E omita o parâmetro de retorno de chamada:

     $.ajax({ type : "GET", url : "http://example.com/feed/json.php", dataType : "json" }); 

    Faça o retorno do script do lado do servidor JSONP, ou seja, JSON envolto em uma function de retorno de chamada:

     Content-Type: application/javascript jQuery_xxxxxxxx({"Announcement":{"ID":1}}); 

    E troque o tipo de dados para jsonp:

     $.ajax({ type : "GET", url : "http://example.com/feed/json.php", dataType : "jsonp" }); 

    Observe que jQuery silenciosamente acrescenta &callback=jQuery_xxxxxxxx ao URL para tais solicitações. O servidor deve usar o nome de retorno de chamada especificado no URL. Você pode fazer algo como isto:

     echo sprintf( "%s(%s);", isset($_GET["callback"]) ? $_GET["callback"] : "void", json_encode($data) ); 

    Eu apenas tentei e aqui está a solução testada em domínio cruzado

     $.ajax({ type : "GET", url : "http://******/14621356.php", data : {get_param : "Announcement"}, dataType : "jsonp", error : function(jqXHR, textStatus, errorThrown) {alert(errorThrown); alert(textStatus);}, success : function(data) {alert('success'); $.each(data, function(index, element) { alert('here'); $("#announcements-list").append("
  • " + element.Type + ": " + element.Text + "

  • "); $("#announcements-a-" + element.ID).bind('click', function() {Announcements.AnnouncementID = element.ID;}); }); $("#announcements-list").listview('refresh'); } });

    E para o php

     header('Content-Type: application/json'); echo $_GET['callback'].'('.'{"Announcement":{"ID":1,"Type":1,"Text":"This is a test Albums announcement.","TimeStart":"1969-12-31","TimeEnd":"1969-12-31"}}'.')'; 

    Cuide do jsonp no dataType.