Uncaught SyntaxError: Ficha inesperada :

Estou executando uma chamada AJAX no meu script MooTools, isso funciona bem no Firefox, mas no Chrome estou recebendo um Uncaught SyntaxError': Ficha inesperada :erro, não consigo determinar porquê. Comentando código para determinar onde está o código ruim não rende nada, estou pensando que pode ser um problema com o JSON sendo devolvido. Ao verificar no console vejo que o JSON retornado é o seguinte:

{"votes":47,"totalvotes":90}

Eu não'não vejo nenhum problema com isso, por que este erro ocorreria?

vote.each(function(e){
  e.set('send', {
    onRequest : function(){
      spinner.show();
    },
    onComplete : function(){
      spinner.hide();
    },
    onSuccess : function(resp){
      var j = JSON.decode(resp);
      if (!j) return false;
      var restaurant = e.getParent('.restaurant');
      restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
      $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
      buildRestaurantGraphs();
    }
  });

  e.addEvent('submit', function(e){
    e.stop();
    this.send();
  });
});

Apenas um FYI para pessoas que podem ter o mesmo problema -- eu apenas tive que fazer meu servidor enviar de volta o JSON como aplicação/json e o manipulador de jQuery padrão funcionou bem.

Comentários (6)

Isto acabou de acontecer comigo, e a razão não foi nenhuma das razões acima. Eu estava utilizando o comando jQuery getJSON e adicionando callback=? para utilizar JSONP (como eu precisava ir cross-domain), e retornando o código JSON {"foo":"bar"} e recebendo o erro.

Isto é porque eu deveria ter incluído os dados de retorno, algo como jQuery1720931400557777471107_1335958194322({"foo":"bar"})

Aqui está o código PHP que eu usei para conseguir isso, que se degrada se o JSON (sem uma chamada de retorno) for utilizado:

$ret['foo'] = "bar";
finish();

function finish() {
    header("content-type:application/json");
    if ($_GET['callback']) {
        print $_GET['callback']."(";
    }
    print json_encode($GLOBALS['ret']);
    if ($_GET['callback']) {
        print ")";
    }
    exit; 
}

Esperemos que isso ajude alguém no futuro.

Comentários (3)
Solução

Eu acabei de resolver o problema. Havia algo a causar problemas com uma chamada de pedido padrão, por isso este é o código que usei em seu lugar:

vote.each(function(element){                
  element.addEvent('submit', function(e){
    e.stop();
    new Request.JSON({
      url : e.target.action, 
      onRequest : function(){
        spinner.show();
      },
      onComplete : function(){
        spinner.hide();
      },
      onSuccess : function(resp){
        var j = resp;
        if (!j) return false;
        var restaurant = element.getParent('.restaurant');
        restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
        $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
        buildRestaurantGraphs();
      }
    }).send(this);
  });
});

Se alguém sabe porque é que o objecto padrão do Request me estava a dar problemas, eu adoraria saber.

Comentários (6)