8792 sujets

Développement web côté serveur, CMS

Bonjour,

Me voilà encore en perdition... depuis quelques heures...

J'expose mon problème : sur mon site ( Smiley url http://www.demapage.fr[/url],si vous voulez vous rendre compte du problème), je voudrais que mon formulaire d'inscription se charge grâce à l'AJAX (j'aime pas trop ce nom, mais je ne sais pas quoi dire d'autre, HttpRequest ??). C'est pas forcément nécessaire ici, c'est vrai, mais je m'en sers aussi pour la suite de mon site (ensuite, j'essaierai de bosser sur une méthode plus accessible, à savoir charger tout de même les choses si le navigateur ne supporte pas l'HttpRequest). Bref, revenons en à ma chose... J'utilise Firefox et tout semble fonctionner correctement. (oh joie !), mais sur Internet Explorer c'est une autre histoire : on peut charger le formulaire 1 fois, mais pas 2 !!! Après tout se bloque sur 'Patientez Svp...' (et c'est pareil pour les autres pages de mon site où c'est carrément très génant).
J'ai alors commencé à égréner les heures à la recherche d'une solution (je n'ai rien d'un programmeur expérimenté...) et suite à mes recherches, j'ai vu qu'en vidant le cache de mon IE 6.0, ça marche... Donc d'après ce que j'ai trouvé, il suffit d'inclure ce code dans la page chargée :

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-control: private");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");


pour interdir la mise en cache sous IE... et donc plus de problème...

Et bien si Smiley decu . Pour moi, ça ne change rien... Je ne sais pas si je ne mets pas ce code au bon endroit (je pensais que les 'header' devait se mettre au tout début..., mais là j'en vient à vouloir tout jeter par la fenêtre alors je demande de l'aide ! (avant !)

Pour info, ma fonction open_page() appelée quand on clicque sur 'Inscrivez-vous' est inspirée de ce que j'ai trouvé sur OpenWeb :



var http_request = false;
var req;

function getHTTPObject()
{
  var xmlhttp = false;
  /* Compilation conditionnelle d'IE */
  /*@cc_on
  @if (@_jscript_version >= 5)
     try
     {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
     }
     catch (e)
     {
        try
        {
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (E)
        {
           xmlhttp = false;
        }
     }
  @else
     xmlhttp = false;
  @end @*/
  /* on essaie de créer l'objet si ce n'est pas déjà fait */
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
  {
     try
     {
        xmlhttp = new XMLHttpRequest();
     }
     catch (e)
     {
        xmlhttp = false;
     }
  }
  return xmlhttp;
}
function open_page(url) {
  /* Création de l'objet : */
  var xmlhttp = getHTTPObject(); 
  /* Préparation d'une requête asynchrone de type GET : */
  xmlhttp.open("GET",url,true); 
  /* Effectue la requête : */
  xmlhttp.send(null); 
  if (xmlhttp)
  {
    var div = document.getElementById('ajax_div');
    div.innerHTML = "Chargement de la page - Merci de patienter...";
    div.style.display = "block";
    div.style.top = "35%";
    /* on définit ce qui doit se passer quand la page répondra */
     xmlhttp.onreadystatechange=function()
     {
        if (xmlhttp.readyState == 4) /* 4 : état "complete" */
        {
           if (xmlhttp.status == 200) /* 200 : code HTTP pour OK */
           {
              /*
              Traitement de la réponse.
              */
              div.innerHTML = xmlhttp.responseText;
              div.style.top = "15%";
           }
           else {
             div.innerHTML = "Il y a eu un problème, merci de ré-essayer";
           }
        }
     }
  }
}


et mon formulaire est une page html classique avec <head> et <body>... (mais j'ai aussi essayé sans) et renommée en .php depuis que j'ai ajouté les 'header' :

<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-control: private");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<style>
span.hidden{
  display: none;
}
span.error{
  display: inline;
  color: black;
  background-color: pink;  
}
</style>

</head>

<body>

<span id="close_popup" onclick="hide_popup();">X</span>
<div id="titre_popup">
  <span id="titre_rss">
    Demandez votre Démapage, c'est gratuit !
  </span>
</div>
<div id="corps">
<form method="POST" action="valider_inscription.php" name="form_inscruption" id="form_inscription">
  <h6 style="margin: 20px;">Conformément aux lois informatiques, vous pourrez à tout moment demander la suppression des informations vous concernant. Aucune information n'est transmise à un tiers.</h6>

<fieldset id="form_1" class="showed">

  <label for="newlogin"><p>Choisissez votre login : 
    <input type="text" id="newlogin" name="newlogin" value="" size="20" onfocus="document.getElementById('info_login').className = 'vu_enligne';" onkeyup="checklogin(this.value);" onblur="document.getElementById('info_login').className = 'cache';" />
    <span class="cache" id="checkname"><h6 style="display:inline;">Ce login est déjà pris...</h6></span>
    <span id="info_login" class="cache"> etc etc etc...
</html>


J'espère ne pas avoir mis un message trop long, mais si il vous faut encore des indications, n'hésitez pas...

Merci d'avance.

Fred.
Modifié par fretoune (12 Jan 2006 - 13:36)
Bonjour,
As-tu essayé d'afficher dans le navigateur la page que tu es censé appeler par xhr ?
Parce qu'il m'est parfois arrivé d'obtenir des erreurs 500 internal server error avec les header php interdisant la mise en cache.
Que se passe-t-il exactement ?
Message d'erreur ? Le navigateur ignore la requête ? Autre symptômes ?
Ben si tu es sur IE, peut-être peux tu essayer. Tu verras que le message 'Chargement des données. Merci de patienter...' s'affiche et reste affiché en permanence. Exactement, je ne sais pas ce qui se passe. Je mets des 'alert' pour essayer de comprendre, mais à vrai dire je ne comprends pas grand chose... et comme je le disais plus haut, je n'ai rien d'un programmeur confirmé...

Ce qui me surprend c'est qu'avec mes multiples essais, ça marche TOUJOURS la 1ère fois (quand j'ouvre IE, ou quand je vide le cache manuellement) et ça plante TOUJOURS après ! Et ce qui me surprend aussi (et me fait plaisir), c'est que ça marche nickel avec Firefox.

Bref, demain j'essaierai sur une autre machine (avec IE et FIrefox). On verra bien ..

J'ose à peine imaginer les soucis quand j'essaierai de voir ce que ça donne avec les autres navigateurs... Smiley sweatdrop

Merci en tous cas de t'intéresser à mon problème !

Fred.
Pour éviter de faire intervenir la mise en cache, tu peux faire un truc très simple : tu ajoutes un paramètre bidon en GET, qui change à chaque fois. Typiquement, la date de l'appel. Ca ne sert à rien, mais au moins, le cache n'est pas utilisé puisque l'URL change à chaque fois.
Le truc est pas mal. Je viens de le mettre en place, et en effet, en actualisant ma page d'accueil, je peux ainsi à nouveau recharger mon formulaire.

Le problème reste cependant présent car normalement, on ne devrait pas recharger la page (c'est quand même le but du HttpRequest...)...

Je suis vraiment surpris... D'un côté, je comprends que pour cette utilisation précise, je pourrais charger mon formulaire avec ma page dna sune <div> cachée, puis la faire apparaître quand nécessaire, et mon problème serait réglé, mais dans la suite de mon site (voir la démo, par exemple), j'utilise ce procédé du HttpRequest pour consulter des fils Rss ou encore pour utiliser un bloc-note. Là le problème me semble réel (je le répète, pour des raisons d'accéssibilité, je chercherai un autre fonctionnement plus tard, mais pour le moment, je souhaitais tirer profit du côté pratique et dynamique de l'HttpRequest)...

Merci encore pour ces réponses ! En espérant une solution ultime bientôt Smiley smile

Fred.

PS : J'ai essayé ailleurs que chez moi, mêmes conclusions.
Je crois que je n'avais pas cerné toutes les nuances de l'astuce...

Je viens de mettre mon paramètre bidon grâce au javascript : je prend l'heure à chaque fois qu'on clique sur l'inscription (les secondes changent donc) et du coup ça fonctionne. L'astuce est donc une solution pas mal à mon problème. Merci !

Toujours est-il que j'aimerais bien ne pas avoir recours à ce genre d'astuces... Par contre je suis surpris de ne pas trouver plus d'infos à ce sujet. Serais-ce une si mauvaise solution que d'afficher un morceau de page de cette manière là... Qu'en pensez-vous?

Aïe. Je viens d'essayer une autre manip... Mon test de login dans mon formulaire... Celui-ci est vérifié avec HttpRequest aussi... ça marche sous Firefox, mais encore une fois pas sous IE... ça me gonfle sérieusement... Cette manip là n'est pourtant pas mal utilisée par d'autres sites, et chez eux ça doit marcher sous IE... Comment font-ils ??

Je vais retourner voir ça... (quand j'aurais un peu de temps, car là ça commence à faire beaucoup d'heures pour un problème de compatibilité... Smiley fache )

Fred.

PS : désolé pour les URL dans mes Posts...
Bonjour,
J'ai le même problème que toi, j'ai un formulaire qui vérifie en "live" si le login est disponible en utilisatn la méthode "Ajax", sous FireFox rien à dire tout marche correctement, mais sous IE c'est un banal formulaire sans vérification, aucun affichage. En fait j'appelle ma fonction ainsi:
<input id="formlogin" name="formlogin" type="text" onKeyUp="verifLogin('reponseLogin',this.value)"/>


Serais-ce à cause du OnKeyUp ?

Merci d'avance
Bonjour,

Le onkeyup n'est pas la cause. La solution qui fonctionne pour moi, c'est bien d'ajouter un paramètre bidon à l'adresse de la requête http. Voici mon code :

function check_login(login) {
  var url = 'http://www.demapage.fr/script/checklogin.php';
  //Pour gérer le problème de cache IE
  var param_bidon = new Date();  
  var pars = 'q='+login+'&parambidon='+param_bidon;
  var myAjax = new Ajax.Request(
  url, 
  {
        method: 'get', 
        parameters: pars, 
        onComplete: login_checked
  });
}

(j'utilise la Prototype library).

Mon 'onkeyup' appelle cette fonction check_login() et au retour de la requête, j'effectue login_checked() qui gère l'erreur en cas de login déjà pris...

Je pense que c'est un peu du bidouillage (je n'ai rien d'un pro...) mais ça fonctionne (pour l'instant). J'espère t'avoir aidé un petit peu (ce serait la 1ère fois que je me trouve en mesure d'aider quelqu'un Smiley smile !)
J'ai essayé d'appliquer ton astuce, mais ça ne change rien, on peut tester mon formulaire ICI, sous firefox, aucuns problèmes, mais avec IE, rien ne marche, pas même la vérification de la longueur du login, qui pourtant ne demande pas de XHttpRequest.

Une idée ?