Page 1 sur 1

Problème double "appel" de la page (alert() exec

Publié : 22 mars 2009, 13:54
par bdfi
Suite à un problème de "répétition de requête" (le formulaire était exécuté deux fois sans comprendre pourquoi), j'ai trouvé sur le web que cela arrivait si par exemple l'url d'une image était vide (ref : http://www.developpez.net/forums/d23756 ... -src-vide/). N'ayant à priori pas d'erreur strictement identique, j'ai dépouillé mon source php au maximum (cf ci-dessous) pour s'apercevoir que c'était un caractère accentué qui semblait poser le problème. (je précise que dans mon cas les caractères proviennent d'une base; et bien entendu, le problème ne se pose plus si par exemple on remplace è par "è", donc il suffirait que je transcode les lectures).
Mais est-ce normal ? Autant c'est logiquement explicable dans le cas d'un img src='', autant ici c'est plus surprenant... Et ce qui pose problème à mon avis, même si c'est bien un comportement "normalisé", c'est le temps passé rien que pour trouver le problème potentiel...

Code avec lequel sous firefox 3.0.7 le alert 'body' est exécuté deux fois, le 'fin code' une fois :

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Two body alert?</title></head>
<body>
<script type='text/javascript'>javascript:alert('body')</script>
è
<script type='text/javascript'>javascript:alert('fin code')</script>
</body>
</html>
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7

Publié : 22 mars 2009, 16:43
par jpj
Je déplace dans "Développement web".

Publié : 22 mars 2009, 17:02
par Benoit
Je ne sais pas pourquoi le code est exécuté deux fois, mais ce qui m'étonne c'est qu'il soit même exécuté.

D'une part ton code JavaScript n'est pas échappé dans un bloc CDATA alors qu'il se trouve dans le body, et en plus il y a ces préfixes « javascript: » qui ne veulent rien dire.

Publié : 22 mars 2009, 17:46
par bdfi
Benoit a écrit :Je ne sais pas pourquoi le code est exécuté deux fois, mais ce qui m'étonne c'est qu'il soit même exécuté.

D'une part ton code JavaScript n'est pas échappé dans un bloc CDATA alors qu'il se trouve dans le body, et en plus il y a ces préfixes « javascript: » qui ne veulent rien dire.
Of course, mais ce n'est pas le problème :) Pour le CDATA, j'avais fait l'essai, mais je préférais garder un extrait court pour montrer le pb, pour le javascript, mea culpa, c'est un résidu... Remplacer par :

Code : Tout sélectionner

<!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">
  <head>
    <title>
      Two body alert ?
    </title>
  </head>
  <body>
    <script type='text/javascript'>
//<![CDATA[
    alert('body')
    //]]>
    è <script type='text/javascript'>
//<![CDATA[
    alert('fin code')
    //]]>
    </script>

  </body>
</html>
Le résultat est le même. je sais bien que dans ce cas précis si je remplace è par &egrave; ça marche, (dans mon cas les données affichées peuvent provenir de différentes sources, donc il faut les convertir) mais la question de départ était (si quelqu'un à la réponse...) : pourquoi un tel comportement de la part de firefox avec le premier caractère accentué ? C'est surprenant et même si c'est un comportement normalisé, ça risque d'embêter du monde...

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7

Publié : 22 mars 2009, 18:33
par bdfi
Pour info : le problème n'apparaît plus dès que l'on ajoute en zone d'entête la ligne

Code : Tout sélectionner

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Ca serait donc bien que lors du traitement du caractère accentué sans aucun charset déclaré, firefox génère une seconde requête identique (un peu comme pour le img src="").

Est-ce quelqu'un sait si un tel comportement est référencé quelque part ?


Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7

Publié : 22 mars 2009, 20:20
par Zefling
Benoit a écrit :Je ne sais pas pourquoi le code est exécuté deux fois, mais ce qui m'étonne c'est qu'il soit même exécuté.

D'une part ton code JavaScript n'est pas échappé dans un bloc CDATA alors qu'il se trouve dans le body, et en plus il y a ces préfixes « javascript: » qui ne veulent rien dire.
En théorie c'est pour protéger le code si c'est nécessaire (notamment à cause des caractères « spéciaux » : < et &). Si il n'y en a pas à protéger, c'est pas obligatoire.

http://www.w3.org/TR/xhtml1/#h-4.8

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)

Publié : 23 mars 2009, 08:21
par Benoit
Ici je pense que c'est justement une des balises de script qui n'est pas reconnue comme telle à cause du mélange avec le caractère précédent ou suivant.

bdfi : le problème n'est pas tant qu'aucun charset n'est déclaré, c'est que ton fichier est enregistré en UTF-8. Le jeu de caractères par défaut est ISO-8859-1, et les caractères accentués n'y sont pas représentés sur le même nombre d'octets.

Publié : 23 mars 2009, 09:18
par martin
Désolé, mais en essayant le fichier test corrigé (une balise script non fermée), je n'ai aucun problème:

Code : Tout sélectionner

<!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">
  <head>
    <title>Two body alert ?</title>
  </head>
  <body>

    <script type='text/javascript'>
        alert('body')
    </script>
    è
    <script type='text/javascript'>
        alert('fin code')
    </script>

  </body>
</html> 
J'ai fait le test en local (file://) et sur serveur (http://), avec l'information du charset manquante, et donc un Ú d'affiché à l'écran, et les 2 alert n'apparaissent qu'une seule fois...

[edit]
pour être complet, j'ai enregistré ce fichier en utf-8, mais servi en ISO-8859-1, et comme aucune info n'est présente dans le corps du fichier, en local il est interprété par défaut en ISO-8859-1 également.

Publié : 23 mars 2009, 20:32
par bdfi
Benoit a écrit :bdfi : le problème n'est pas tant qu'aucun charset n'est déclaré, c'est que ton fichier est enregistré en UTF-8. Le jeu de caractères par défaut est ISO-8859-1, et les caractères accentués n'y sont pas représentés sur le même nombre d'octets.
Le problème a disparu lorsque j'ai ajouté le charset, mais comme en même temps je faisais des tests, et que je jongle entre les CP850, CP1252 et UTF-8, impossible de dire en quoi j'enregistrais.

Mais je vais réessayer en essayant plusieurs formats d'enregistrement, histoire de voir exactement quand le problème arrive ou non.

En tout cas, maintenant que j'utilise des iconv pour les transformations entre fichiers d'entrées, fichiers de traces et affichages, je n'ai plus de problèmes du tout.
Martin a écrit :J'ai fait le test en local (file://) et sur serveur (http://), avec l'information du charset manquante, et donc un Ú d'affiché à l'écran, et les 2 alert n'apparaissent qu'une seule fois...
J'avais é d'affiché, avec ou sans le charset, d'ou sans doute un enregistrement utf-8...

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7

Publié : 23 mars 2009, 21:07
par Zefling
bdfi a écrit :J'avais é d'affiché, avec ou sans le charset, d'ou sans doute un enregistrement utf-8...
Si il n'y a aucune information, le navigateur essaie de deviner le charset par déduction (je me sert d'ailleurs de cette fonctions pour trouver le format d'enregistrement des certains fichiers .info ou readme que je récupère, histoire de savoir dans quel mode je dois lancer le logiciel)