web-dev-qa-db-fra.com

Uncaught SyntaxError: Jeton inattendu:

J'exécute un appel AJAX dans mon script MooTools, cela fonctionne bien dans Firefox, mais dans Chrome, une erreur Uncaught SyntaxError: Unexpected token : s'affiche, je ne peux pas déterminer pourquoi. Commenter le code pour déterminer où le code est mauvais ne donne rien, je pense que cela pourrait être un problème avec le retour du code JSON. En consultant la console, le code JSON renvoyé est le suivant:

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

Je ne vois pas de problèmes avec cela, pourquoi cette erreur se produirait-elle?

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();
  });
});
161
trobrock

Je viens de résoudre le problème. Il y avait quelque chose qui causait des problèmes avec un appel standard, c'est donc le code que j'ai utilisé à la place:

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

Si quelqu'un sait pourquoi l'objet Request standard me posait des problèmes, j'aimerais le savoir.

16
trobrock

Voyant les erreurs rouges 

Uncaught SyntaxError: Jeton inattendu <

dans l'onglet de la console de votre développeur Chrome, il est souvent indiqué/ 301 redirections pouvant être provoquées par le fait qu'une règle étrange figure dans votre fichier .htaccess. 

Ce que vous voyez réellement est la réaction de votre navigateur face à la ligne de tête inattendue <!DOCTYPE html> du serveur.

79
andy magoon

Juste un FYI pour les personnes qui pourraient avoir le même problème - il me suffisait de faire renvoyer le JSON par JSON sous le nom application/json et le gestionnaire jQuery par défaut fonctionnait correctement.

78
Edward Abrams

Cela vient de m'arriver, et la raison n'était aucune des raisons ci-dessus. J'utilisais la commande jQuery getJSON et ajoutais callback=? pour utiliser JSONP (car j'avais besoin d'aller sur plusieurs domaines), et renvoyais le code JSON {"foo":"bar"} et obtenais l'erreur.

C'est parce que j'aurais dû inclure les données de rappel, quelque chose comme jQuery17209314005577471107_1335958194322({"foo":"bar"})

Voici le code PHP que j'ai utilisé pour cela, qui se dégrade si JSON (sans rappel) est utilisé:

$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; 
}

J'espère que cela aidera quelqu'un à l'avenir.

40
Grim...

Je pensais ajouter mon problème et ma résolution à la liste.

Je recevais: Uncaught SyntaxError: Unexpected token < et l'erreur pointait vers cette ligne dans ma déclaration de succès ajax:

var total = $.parseJSON(response);

J'ai découvert par la suite qu'en plus des résultats JSON, du HTML était envoyé avec la réponse car j'avais une erreur dans mon PHP. Lorsque vous obtenez une erreur dans PHP, vous pouvez le configurer pour vous avertir avec d'énormes tables orange. Ces tables étaient ce qui rejetait le JSON.

J'ai découvert cela en faisant simplement un console.log(response) afin de voir ce qui était réellement envoyé. S'il s'agit d'un problème avec les données JSON, essayez simplement de voir si vous pouvez créer un fichier console.log ou une autre instruction qui vous permettra de voir ce qui est envoyé et ce qui est reçu.

10
Keven

Lorsque vous demandez votre fichier JSON, le serveur renvoie l'en-tête JavaScript Content-Type (text/javascript) au lieu de JSON (application/json).

Selon la documentation MooTools :

Les réponses avec le type de contenu javascript seront évaluées automatiquement.

En conséquence, MooTools essaie d'évaluer votre JSON en tant que JavaScript et lorsque vous essayez d'évaluer un tel JSON:

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

en tant que JavaScript, l'analyseur traite { et } comme une étendue de bloc au lieu d'une notation d'objet. Cela revient à évaluer le "code" suivant:

"votes":47,"totalvotes":90

Comme vous pouvez le constater, : y est totalement inattendu.

La solution consiste à définir un en-tête Content-Type correct pour le fichier JSON. Si vous enregistrez avec l'extension .json, votre serveur doit le faire lui-même.

7

Il semble que votre réponse soit évaluée d'une manière ou d'une autre. Cela donne la même erreur dans Chrome:

var resp = '{"votes":47,"totalvotes":90}';
eval(resp);

Cela est dû au fait que les accolades '{...}' sont interprétées par javascript comme un bloc de code et non comme un objet littéral comme on pourrait s'y attendre.

Je regarderais la fonction JSON.decode () et verrais s'il y a un eval dedans.

Problème similaire ici: Eval () = Jeton inattendu: erreur

3
Zectbumo

J'ai eu le même problème et il s'est avéré que le Json est revenu du serveur N'était pas valide Json-P. Si vous n'utilisez pas l'appel en tant qu'appel interdomaine, utilisez Json standard.

1
jakob

Ceci est dû à la configuration de mes règles sur mon serveur express qui permet de renvoyer n'importe quel 404 à /#, quelle que soit la demande initiale. Permettre au routeur angulaire/js de gérer la requête. S'il n'y a pas de route js pour gérer ce chemin, une demande pour /#/whatever est faite au serveur, qui est simplement une demande pour /, la page Web entière. 

Donc, par exemple, si je voulais faire une demande pour /correct/somejsfile.js mais que je manque de le taper pour /wrong/somejsfile.js, la demande est faite au serveur. Cet emplacement/fichier n’existant pas, le serveur répond par un 302 location: /#/wrong/somejsfile.js. Le navigateur suit joyeusement la redirection et la page Web entière est renvoyée. Le navigateur analyse la page comme js et vous obtenez

Uncaught SyntaxError: Jeton inattendu <

Donc, pour aider à trouver le chemin/demande incriminé, recherchez 302 demandes.

J'espère que ça aide quelqu'un. 

1
Jerinaw

Cela m'est arrivé aujourd'hui aussi. J'utilisais EF et renvoyais une entité en réponse à un appel AJAX. Les propriétés virtuelles sur mon entité provoquaient une erreur de dépendance cyclique non détectée sur le serveur. En ajoutant l'attribut [ScriptIgnore] sur les propriétés virtuelles, le problème a été résolu.

Au lieu d'utiliser l'attribut ScriptIgnore, il serait probablement préférable de simplement renvoyer un DTO.

1
Daryl

" Uncaught SyntaxError: Jeton inattendu " erreur apparaissant lorsque vos données renvoient un format JSON incorrect. Dans certains cas, vous ne savez pas que vous vous êtes trompé.
s'il vous plaît vérifier avec alert (); une fonction 

onSuccess : function(resp){  
   alert(resp);  
}

votre message reçu devrait être: {"firstName": "John", "lastName": "Doe"}
.__ et ensuite vous pouvez utiliser le code ci-dessous

onSuccess : function(resp){  
   var j = JSON.decode(resp); // but in my case i'm using: JSON.parse(resp); 
}

with out error " Uncaught SyntaxError: Jeton inattendu "
mais si vous vous trompez de format json
ex: 

... {"prénom": "Jean", "nom": "biche"}

ou 

Undefined variable: errCapt in .... on line<b>65</b><br/>{"firstName":"John", "lastName":"Doe"}

afin que vous obteniez le mauvais format JSON, corrigez-le avant JSON.decode ou JSON.parse

1
Serip88

Pour ceux qui rencontrent ce problème dans AngularJs 1.4.6 ou similaire, mon problème était dû au fait que angular ne trouvait pas mon modèle car le fichier situé à la templateUrl (chemin) que j’avais fourni était introuvable. Je devais juste fournir un chemin accessible et le problème est parti.

0
lwdthe1

Pour moi, l'ampoule s'est allumée lorsque j'ai visualisé la source sur la page du navigateur Chrome. J'ai eu un support supplémentaire dans une déclaration if. Vous verrez immédiatement le cercle rouge avec une croix à l'intérieur de la ligne défaillante. C'est un message d'erreur plutôt inutile, parce que l'erreur de syntaxe Uncaught: Unkenken inattendue ne fait pas référence à un numéro de ligne lorsqu'il apparaît pour la première fois dans la console de Chrome.

0
JGFMK

J'ai reçu un "SyntaxError: Unexpected token I" lorsque j'ai utilisé jQuery.getJSON() pour essayer de désérialiser une valeur à virgule flottante de Infinity, codée en tant que INF, ce qui est illégal en JSON.

0
Mark Cidade

Dans mon cas, j'ai rencontré la même erreur lors de l'exécution de l'application MVC de Spring en raison d'une mauvaise cartographie dans mon contrôleur MVC.

@RequestMapping(name="/private/updatestatus")

j'ai changé la cartographie ci-dessus en 

 @RequestMapping("/private/updatestatus")

ou

 @RequestMapping(value="/private/updatestatus",method = RequestMethod.GET)
0
Shravan Ramamurthy

Je me suis trompé en cela

   `var  fs = require('fs');
    var fs.writeFileSync(file, configJSON);`

Déjà j’ai commencé la variable fs.Mais encore, j’ai mis var à la deuxième ligne.Cela donne aussi ce genre d’erreur.

0
Jana

Si rien n’a de sens, cette erreur peut également être provoquée par PHP Erreur incorporée dans HTML/javascript, telle que celle ci-dessous.

<br />
<b>Deprecated</b>:  mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in <b>C:\Projects\rwp\demo\en\super\ge.php</b> on line <b>54</b><br />
var zNodes =[{ id:1, pId:0, name:"ACE", url: "/ace1.php", target:"_self", open:true}

Ce n'est pas le <br />etc dans le code inséré dans le code HTML par PHP qui provoque l'erreur . Pour corriger ce type d'erreur (supprimer l'avertissement), utilisez ce code au début

error_reporting(E_ERROR | E_PARSE);

Pour afficher, cliquez avec le bouton droit de la souris sur la page "Afficher la source", puis examinez le code HTML complet pour identifier cette erreur.

0
Hammad Khan

Dans mon cas, c'était une URL erronée (non existante), alors peut-être que votre 'envoyer' en deuxième ligne devrait être autre ...

0
Michal Wrd