11540 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je reprends un site dont le code a été écrit par un autre et je n'arrive pas à voir ce qui empêche le javascript de fonctionner...

En effet, quelques éléments (entre autres les adresses mail) sont normalement affichés par du javascript. Or, ces éléments ne s'affichent dans aucun navigateur sauf konqueror (testé avec firefox, chromium, opéra, icecat et donc konqueror), pas plus que le code de la balise <noscript> !

Pourtant, quand je recopie ce code javascript dans une page de test faite par mes soins, il s'affiche bien correctement dans tous les navigateurs ! Et tout code javascript et toute balise <noscript> que j'ajoute dans ce site refuse de fonctionner !

J'avoue ne pas être un fan (et donc pas un pro) de JS, et j'y perds mon latin ! Y a-t-il un quelconque code que je n'aurais pas vu qui puisse provoquer ce phénomène ? (beaucoup de PHP et d'includes dans ce code, pas impossible que quelque chose m'ait échappé)

Comment puis-je essayer de débugger ça ?
Modifié par jibe74 (17 Jun 2014 - 11:35)
Bonjour,

Pas un qui peut me donner une petite piste de recherche ?

Qu'est-ce qui pourrait bien faire que sur ce site, le JS ne fonctionne pas ? Il y a forcément une raison, mais comment la trouver ?
Modérateur
Bonjour,

La question semble bien trop générale. Il faut déjà déterminer où doit se trouver le code javascript en question (est-il directement inclus dans la page ? dans un fichier à part ? exécuté après une requête AJAX ? …).

Ensuite, il faut vérifier dans le code source de la page généré par le serveur et envoyé au navigateur que le javascript se trouve bien là où il doit être.

Si le code javascript est bien là, il faut alors lui ajouter des traceurs (par un alert(1) au début de son code) pour voir s'il est exécuté ou pas du tout (soit il n'est jamais exécuté et il faut rechercher pourquoi, soit il l'est mais plante avant de finir son exécution et dans ce cas il faut rechercher où exactement en ajoutant par exemple d'autres alert()). Sinon, il faut chercher la raison pour laquelle il n'est pas dans le code source de la page.
Bonjour,

parsimonhi a écrit :
La question semble bien trop générale.

ohweb a écrit :
Sans un bout de code, difficile de t'aider...

Oui, j'en ai bien conscience. Mais désolé : comme je l'ai dit, quand j'essaie dans "un bout de code" à part les mêmes instructions javascript (copier-coller de tout le contenu de la balise <script>...</script>), ça fonctionne très bien !

parsimonhi a écrit :
Il faut déjà déterminer où doit se trouver le code javascript en question (est-il directement inclus dans la page ? dans un fichier à part ? exécuté après une requête AJAX ? …).

Ensuite, il faut vérifier dans le code source de la page généré par le serveur et envoyé au navigateur que le javascript se trouve bien là où il doit être.

Il y en a des petits bouts disséminés dans la page (et donc dans divers include Smiley rolleyes ). Ça ne m'a pas l'air trop mal fait, juste un peu difficile de s'y retrouver (genre usine à gaz !). En tous cas, le code source de la page donné par le navigateur montre bien le javascript là où il doit être...


parsimonhi a écrit :
Si le code javascript est bien là, il faut alors lui ajouter des traceurs (par un alert(1) au début de son code) pour voir s'il est exécuté ou pas du tout (soit il n'est jamais exécuté et il faut rechercher pourquoi, soit il l'est mais plante avant de finir son exécution et dans ce cas il faut rechercher où exactement en ajoutant par exemple d'autres alert()).

Il semblerait que le code plante, en tous cas qu'il ne se termine pas : le premier alert() s'affiche bien, mais pas celui en fin de code. Idem pour les scripts suivants, ce qui fait que j'ai ma série de boites de dialogue "début du code", et aucune de celles indiquant "fin de code".

Cela se produit par exemple sur des mini scripts destinés à afficher des adresses mail de manière "indétectable" (?) aux robots :
<script type="text/javascript">
alert('début du code');
//<![CDATA[
var d="";for(var i=0;i<416;i++)d+=String.fromCharCode(("XXXX".charCodeAt(i)+53)%95+32);eval(d)
//]]>
alert('fin du code');
</script>

(j'ai remplacé le code générant l'adresse mail par XXXX : que le problème vienne de cette partie ou non, il est le même avec toutes les adresses mail, et ne se produit pas quand on recopie ce code dans une page de test).

BinaryPunk a écrit :
Tu n'as pas d'erreurs dans la console JavaScript ?

Si :
InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable

Curieusement, cette erreur se retrouve dans tous les scripts, mais ne se produit pas lorsque je recopie les scripts dans une page de test !

Qu'est-ce qui peut bien, dans cette page uniquement, rendre ce CDATA inutilisable ?
Modérateur
Bonjour,

Il faut continuer à déterminer plus précisément où exactement ça plante (soit avec les outils de développement du navigateur, soit en rajoutant des alert() un peu partout).

Si le code arrive par morceaux dans la page (puisqu'il semble qu'il y en ait un peu partout), il faut vérifier qu'il arrive dans le bon ordre.

Bon surf !
Modifié par parsimonhi (31 May 2014 - 04:14)
Bonjour,

A priori, ce n'est pas une histoire de code qui arrive dans le mauvais ordre : le code est bien là, au bon endroit, mais n'est pas exécuté.

Dans l'exemple que j'ai donné :
<script type="text/javascript">
alert('début du code');
//<![CDATA[
var d="";for(var i=0;i<416;i++)d+=String.fromCharCode(("XXXX".charCodeAt(i)+53)%95+32);eval(d)
//]]>
alert('fin du code');
</script>

ce code est bien présent dans le code source montré par le navigateur, et au bon endroit !

Tout le code de la page, visualisé par la fonction "code source" du navigateur, est correct. D'ailleurs, je pourrais faire l'essai de comparer les codes sources restitués par Firefox (où le JS ne fonctionne pas) et Konquéror (où JS fonctionne parfaitement), mais je suis quasiment sûr du résultat : il sera exactement identique. En tous cas, les parties que j'ai observées - principalement les scripts JS - sont exactement les mêmes.
Bonjour,

Désolé pour la lenteur à la réaction : quelques petits ennuis de santé m'ont obligé à prendre un peu de repos.

Piste intéressante en effet, merci Lothindil. Je regarderai ça de plus près dès que j'aurai à nouveau accès au code. Toutefois :

1 - Ça reste à confirmer, mais je suis presque sûr que le doctype est bien xhtml.
2 - Les CDATA sont bien de la forme préconisée pour une bonne compatibilité :
<script  type="text/javascript">
  //<![CDATA[
     ...
  //]]>
  </script>


Je tiens au courant dès que j'ai pu regarder ça de plus près. Merci en attendant Smiley smile
Bonjour,

C'est bien ce que je pensais :
<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">

Donc, l'idée était bonne, mais ce n'est pas le cas...

D'autres pistes ?
jibe74 a écrit :
Donc, l'idée était bonne, mais ce n'est pas le cas...

Ben si, c'est bien ça ! Merci Lothindil Smiley baiser

Voici la DTD d'une page où JS fonctionne sans problème :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">

En mettant cette DTD à la place de celle du post précédent, tout rentre dans l'ordre ! Smiley cool

J'ai fini par trouver en faisant des comparaisons sur l'entête des pages, et pas vraiment tenu compte de ce post intéressant que je viens de découvrir. Ça n'enlève rien à sa valeur !

Merci à tous !
Modifié par jibe74 (17 Jun 2014 - 12:20)