Retourner à la page d'accueil de TJS

Les erreurs fréquentes en JavaScript

Comment débugger

On peut distinguer deux grands types d'erreurs, les fameux bugs, dans un code source :

  • Les erreurs de syntaxe détectées par le navigateur qui empêchent l'exécution du code,
  • Les erreurs qui amènent à un fonctionnement différent de celui attendu.
Voici la liste des messages d'erreur les plus courants. En face de chaque message, un ou plusieurs liens redirigent vers une explication de l'origine de l'erreur et vers une correction possible.

Une seconde liste présente les fonctionnements anormaux des scripts et les moyens d'y remédier.

Les erreurs courantes

Liste des messages d'erreur courants

Les messages d'erreur JavaScript sont affichés dans la console du navigateur.

Retrouvez votre message d'erreur dans ce tableau et voyez la réponse à apporter pour débugger.

Libellé de l'erreurAller à

'XXXXX' est indéfini

'XXXXX' n'est pas un objet

Erreur de majuscules/minuscules
Erreur dans la structure du script
Constante de chaîne non terminée Erreur de déclaration de chaîne de caractères
')' attendu Erreur de déclaration de chaîne de caractères
';' attendu Erreur de structure
Erreur de déclaration de chaîne de caractères
Propriété ou méthode non gérée par cet objet Erreur de programmation objet
Incompatibilité entre navigateurs
Objet attendu Erreur de structure
Erreur d'écriture

'parent.XXXXX' est indéfini

'top.XXXXX' est indéfini

Erreur due à l'utilisation des frames ou iframes

Les messages d'erreur varient en fonction du navigateur (Chrome, Firefox, IE, ...) , de l'environnement (Windows, Mac, Linux, ...) et de la langue.

Erreur d'écriture

A mon avis, la principale cause d'erreur reste due aux erreurs de frappe.
Dès qu'une erreur survient, vérifiez l'écriture de la ligne responsable de l'erreur.
Vérifiez que les noms de variables ou de fonctions sont corrects et respectez la différence Majuscule/Minuscule.

Confusion Majuscules/Minuscules

Le JavaScript respecte la casse (différence entre majuscules et minuscules).
Cela oblige à être très vigilant à l'écriture :
  - des fonctions propres au JavaScript
   var today=new date; n'a pas de sens. Date prend une majuscule.
  - de vos variables
     Si vous déclarez var Nombre=100, la variable nombre n'existe pas.

Si votre navigateur vous annonce :
'monObjet' est indéfini

Cela signifie que la variable ou la fonction monObjet n'a pas été déclarée ou a été mal orthographiée.

La structure d'un script

Si la structure du script d'un programme n'est pas respectée, une erreur surviendra à coup sûr.
Le plus souvent, le message n'indique pas la bonne ligne, ce qui rend la recherche de l'origine assez fastidieuse.
Il y a deux cas principaux d'erreur de structure :
  - manque un ; entre deux instructions placées sur la même ligne,
  - non concordance entre les accolades ouvertes et fermées qui vont obligatoirement par paires.

Les erreurs de déclaration de chaînes

Les chaînes de caractères sont décrites en détail dans cet article.
L'erreur la plus courante rencontrée est :
Constante de chaîne non terminée
et aussi :
';' attendu
) attendu

Ce message apparaît dans ce cas simple :

var chaine="Bonjour;

Ici, l'erreur est simple et le message est adapté, la chaîne n'est pas terminée par un marqueur de fin de chaîne. Pour corriger, il faut écrire :

var chaine="Bonjour";

Il y a naturellement des cas de chaîne plus complexes, en particulier quand les marqueurs de chaînes (" et ') sont alternés :

alert("Il m'a dit : "Bonjour"")

L'objectif est d'afficher un message contenant Il m'a dit : "Bonjour"
La difficulté est ici d'afficher un caractère qui sert de marqueur de chaîne. Il existe de nombreuses solutions pour répondre au besoin :

alert("Il m'a dit : \"Bonjour\"");
alert('Il m\'a dit : "Bonjour"');
alert("Il m'a dit : "+'"Bonjour"');

La coloration syntaxique de l'éditeur montre simplement les erreurs de fermeture de chaînes.

Propriété et méthode d'un objet

L'article "le JavaScript, langage objet" présente en détail ce type de programmation.

Le message d'erreur Propriété ou méthode non gérée par cet objet signifie que vous essayez :
  - d'accéder, sur un objet, à une propriété qui n'existe pas.
  - d'appeler, sur un objet, une méthode qui n'est pas définie.

Cette erreur peut être due :
  - à une erreur d'écriture, confusion Majuscule/Minuscule, faute de frappe, ...
  - à une incompatibilité entre navigateurs
  - à une erreur de conception (la propriété/méthode est utilisée, mais pas encore définie)

Utilisation des frames

Les frames sont présentées en détail dans l'article "JavaScript et les frames".

Si le message d'erreur contient parent ou top, vous devez tout de suite penser aux frames ou aux iframe.
L'objet parent correspond à la page mère, celle qui contient la déclaration des frames, via les balises <FRAME> et <FRAMESET>.
L'objet top correspond à la page la plus haute dans la hiérarchie des frames.

Un message 'parent.XXXXX' est indéfini montre que le script s'attend à trouver un objet ou une variable dans la fenêtre parent.
Le script de la fenêtre parente est sûrement incomplet.

La compatibilité entre navigateurs

De nombreuses erreurs apparaissent sur un navigateur et pas sur un autre. Certaines fonctionnalités sont non implémentées ou propre à un navigateur ou encore en phase de validation par le W3C...

Tester son site sur les principaux navigateurs du moment ou un peu ancien est indispensable.

Les fonctionnements anormaux

Un fonctionnement anormal n'est pas une erreur détectée par le navigateur, mais une erreur de conception ou d'écriture qui donne des résultats différents de ceux attendus.

Quelques fonctionnements en anomalie

Anomalie de fonctionnementAller à
Le résultat d'un test if est incohérent Erreur dans l'écriture du test if
Le résultat d'une fonction est incohérent Erreur dans l'écriture de l'appel à une fonction
Le script ne se termine pas
Boucle infinie
Erreur de déclaration de boucle
Les calculs mathématiques sont inexacts Anomalie de calcul
Impossible de lire un cookie Gestion des cookies
Fonctionnement différent entre local et online Différence local / online
Gestion des cookies

Le test if est incohérent

En javascript, l'opérateur "est égal à" est différent de l'affectation d'un contenu à une variable.
Pour affecter 1 à la variable nombre, on écrit :

nombre=1;

Pour détecter que la variable nombre vaut 1, on écrit :

if (nombre==1)

On note ici que :
  - le signe = est doublé pour le test,
  - le test est entre parenthèses.

Si vous écrivez :

if (nombre=1)
le test est toujours vrai et en plus la valeur 1 est affectée à nombre.

Le test "est différent de" s'écrit if (nombre!=1). En javascript, le signe ! indique la négation.

Le résultat d'une fonction est incohérent

Les fonctions javascript attendent la plupart du temps des paramètres qui doivent être placés entre parenthèses et séparés par des virgules.
Même si une fonction n'a pas de paramètre, il faut lui ajouter les parenthèses.

Sans parenthèse, le résultat ne sera pas celui de la fonction, mais le code source de la fonction.

  console.log( Math.random );

affichera dans la console :

Emulation de la console

Tandis que

  console.log( Math.random() );

affichera dans la console le bon résultat, soit un nombre réel aléatoire compris entre 0 et 1 :

Emulation de la console

Boucle infinie

La boucle infinie est un classique des erreurs de comportement d'un script.
Il faut bien vérifier les points suivant :
  - la condition de sortie de boucle est réalisable,
  - la variable de compteur est bien incrémentée,
  - le test de sortie est correctement écrit (voir le test if est incohérent)

Les calculs sont inexacts

Voir aussi la page "Javascript et les mathématiques".

Les calculs exécutés en javascript sont des calculs en virgule flottante, ce qui implique des arrondis.
Et même les arrondis à 15 chiffres après la virgule entraînent des erreurs ou plutôt des inexactitudes.
Par exemple, il peut arriver que le résultat de cos(pi) retourne -0.999999999999999.

Si l'erreur de calcul est due à un arrondi, il n'y a pas grand chose à faire.
Si l'erreur est plus importante, vérifiez les points suivants :
  - Les fonctions trigonométriques utilisent les radians et non les degrés,
  - Règle de priorité des opérations.

Gestion des cookies

Vérifiez d'abord l'utilisation et les fonctions de gestion des cookies sur la page "Javascript et les cookies".

Si le fonctionnement est correct en local mais incorrect en ligne sur le site, vérifiez :
  - l'activation des cookies dans les options du navigateur, car en général, les cookies sont toujours actifs en local
  - l'arborescence du site, car en local, tous les cookies sont stockés au même endroit; en ligne, il existe un stockage différent par répertoire.

Il se peut aussi que le cookie soit plein, en effet la taille est limitée à 2 ou 3 ko maxi.
Parfois quand cette limite est atteinte, le cookie ne répond plus.
L'idéal dans ce cas est de détruire sur le disque dur le fichier des cookies.

Différence local / online

Il arrive fréquemment que le fonctionnement soit correct pendant la phase de test en local, sur le disque dur et que le site ne passe pas du tout quand il est publié sur le net.

Il faut d'abord vérifier que le site complet a bien été transféré. L'idéal est de recommencer le transfert.
Si le problème persiste :
  - Si vous utilisez les cookies, lisez cette réponse.
  - Les liens doivent être créés en relatif. Il ne faut pas de lien du type href="c:\monsite\repertoire\page.htm", mais simplement href="repertoire\page.htm"

Tutoriel écrit par webmaster mis à jour le

Chercher une fonction, un objet, ...

Le 22/11/2017 10:25:57 sur php7 en 13.96 ms