Lors du chargement de ma page dans Google Chrome, j'obtiens une vague erreur dans la console:
Uncaught SyntaxError: Fin d'entrée inattendue
Je n'ai aucune idée de ce qui le cause. Comment pourrais-je procéder pour déboguer cette erreur?
Cette erreur particulière est un fait agaçant à propos de v8 . Dans la plupart des cas, votre JavaScript est cassé d'une manière ou d'une autre. Par exemple, il manque un }
ou quelque chose comme ça.
Exemple donné, cela donnera aussi "fin inattendue de l’entrée":
eval('[{"test": 4}') // notice the missing ]
Mais la cause fondamentale des problèmes semble être que l’URL JSON demandée a un Content-Type de text/html
que Chrome semble apparemment analyser en HTML, ce qui entraîne une fin inattendue de la saisie du fait que le les balises d'image incluses sont en cours d'analyse.
Essayez de régler Content-Type sur text/plain
Je pense que cela devrait résoudre les problèmes.
Néanmoins, la V8 pourrait faire un meilleur travail en disant à l’un exactement où l’entrée s’est terminée de manière inattendue.
Essayez Firebug pour Mozilla - il affichera la position du }
manquant.
Voir mon cas sur un autre question similaire :
Dans mon cas, j'essayais d'analyser un JSON vide:
JSON.parse(stringifiedJSON);
En d'autres termes, ce qui s'est passé est le suivant:
JSON.parse("");
Je reçois cette erreur lorsque j'ai omis un caractère d'accolade de fermeture (}
) en code JavaScript. Vérifiez que vos bretelles sont bien équilibrées.
Pour mémoire, pour tous ceux qui essaient de trouver les différentes causes de cette erreur. Un attribut de données HTML5 vide
data-mydata = ''
provoque l'erreur aussi. Vous devriez vérifier quand la valeur de données est une chaîne nulle et ne pas inclure l'attribut du tout. Il va sans dire que cela concerne en grande partie le code HTML généré par script.
Le problème pour moi était que je faisais $ .ajax avec dataType: "json"
pour une demande POST renvoyant un HTTP 201 (créé) et aucun corps de demande. Le correctif consistait simplement à supprimer cette clé/valeur.
JSHint est efficace pour trouver l'emplacement des crochets manquants ou d'une syntaxe incorrecte.
Une autre cause de cette erreur: si votre API répond intentionnellement sans corps de réponse, mais répond avec un code d'état 200 OK
au lieu d'un code d'état 204 No Content
. Certaines bibliothèques JavaScript peuvent ne pas bien répondre à des types de contenu inattendus lorsqu'il n'y a pas de contenu, utilisez donc le code d'état correct!
Mon problème était avec le cache de Google Chrome. J'ai testé cela en exécutant mon application Web sur Firefox et je n'ai pas eu cette erreur. Alors j'ai décidé d'essayer de vider le cache de Google Chrome et cela a fonctionné.
Il y aura certainement une parenthèse ouverte qui a causé l'erreur.
Je vous suggère d'ouvrir la page dans Firefox, puis d'ouvrir Firebug et de vérifier la console: le symbole manquant s'affichera.
Exemple de capture d'écran:
J'ai rencontré un problème similaire en utilisant la directive ui bootstrap pour angularjs - uib-datepicker, en appuyant sur am/pm toggle.
Erreur dans le gestionnaire d'événements pour (inconnu): SyntaxError: Fin inattendue de Timepicker angulaire d'entrée JSON
En fait, c'était à cause du plugin 'Trans-over' (qui traduit un mot quand il est cliqué). Peut-être que ma réponse aidera quelqu'un, parce que je n'ai rien trouvé sur Internet.
Comme il s'agit d'une opération asynchrone, la onreadystatechange
peut se produire avant que la valeur ait été chargée dans le responseText, essayez d'utiliser un window.setTimeout(function () { JSON.parse(xhr.responseText); }, 1000);
pour voir si l'erreur persiste? BOL
si vous avez une erreur à la balise Anchor, remplacez simplement "Onclick" par "href" ou "href" par "Onclick"
Dans les cas où votre code JavaScript est limité à une seule ligne, une autre cause de cette erreur utilise //
au lieu de /**/
pour vos commentaires.
Mauvais (tout ce qui suit après //
, y compris le }
de fermeture pour votre fonction)
function example() { //comment console.log('TEST'); }
Bon (limite ton commentaire)
function example() { /* comment */ console.log('TEST'); }
Définir l'en-tête Accept
sur application/json
dans la demande a fonctionné pour moi lorsque j'ai rencontré le même problème.
J'ai eu cette erreur et je l'ai corrigé en ajoutant la garde sur readyState
et status
montrés ici:
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// Your code here
}
};