IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Retour submit d'un formulaire


Sujet :

JavaScript

  1. #1
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut Retour submit d'un formulaire
    Bonjour

    Je rencontre un problème pour le téléchargement d'un fichier.
    Lorsque je clique sur un bouton de ma page, j'appelle la fonction javascript suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function export(){
       document.forms['form1'].submit();
    //   unlockPage();
    }
    Cela a pour effet de lancer le téléchargement d'un fichier. Au cours du téléchargement, la page est "verrouillée", un sablier s'affiche au milieu de la page empêchant toute action.
    Lorsque le téléchargement est terminé, il est bien possible d'ouvrir le fichier. Mon problème est que ma page reste verrouillée.
    J'ai une fonction qui la déverrouille (en commentaire dans le code, unlockPage()), mais, placée ici, ma page est déverrouillée peu après avoir validé le formulaire, alors que le fichier n'est pas encore complétement téléchargé.
    Est-il possible donc, d'appeler cette fonction uniquement lorsque le fichier est totalement téléchargée ?

    Merci de votre aide

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    2 questions/remarques :
    1. Qu'appelles-tu "verrouiller la page" ? S'agit-il de désactiver les champs de saisie qu'elle contient, ou de la recouvrir d'un div transparent style greybox ?
    2. Est-ce bien nécessaire ?
    Dis autrement : quelle sont les conséquences (techniques) si tu ne mets pas ce verrou ?

    A priori, si le visiteur a décidé de récupérer le fichier, il va attendre la fin du téléchargement. Mais s'il en décide autrement, libre à lui d'interrompre le téléchargement, d'enregistrer ou d'exécuter le fichier.
    Non ?

    A+

  3. #3
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Merci de ta réponse (rapide qui plus est).
    Vérouiller la page consiste bien à la recouvrir d'un div transparent (avec un sablier au milieu).
    Si on ne met pas ce verrouillage, ce n'est peut être pas si grave. Le problème est que le fichier à télécharger est créé dynamiquement, la fenêtre "ouvrir/ enregistrer" le fichier arrive donc tardivement. L'utilisateur peut se demander pendant un peu de temps (30 secondes) s'il va bien avoir le fichier qu'il désire, car il n'a pas de retour pendant la génération de ce fichier.

    Si c'est impossible, je devrai donc trouver une alternative à ce verrouillage, ou bien ne pas mettre de verrou, mais ce n'est pas ce que je souhaite, d'où mon problème...

  4. #4
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 099
    Par défaut
    Salut Climoo,
    afficher un petit texte du genre « téléchargement en cours, veuillez patienter » c’est toujours bon pour l’ergonomie. Et je trouve ça tout à fait légitime de vouloir le retirer quand le téléchargement est fini.

    J’imagine que la soumission du formulaire est faite par Ajax (sinon le JS n’a aucun intérêt ici), donc tu devrais pouvoir placer unlockPage en tant que fonction de rappel…

    Tu utilises quel framework ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Merci de votre attention
    En fait non, je n'utilise pas Ajax...
    J'utilise une fonction javascript car avant le submit, il y a d'autres lignes de codes (que j'ai supprimées car nuisibles pour la comprehension de mon problème et sans rapport avec).
    L'application est en Java J2EE, avec Struts.

  6. #6
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 099
    Par défaut
    Bonsoir,
    si tu utilises le .submit() par défaut, c'est une requête classique (non Ajax) qui est envoyée, et pour tout ce qui se passe après, c'est le navigateur qui gère : tu n'as aucun contrôle !

    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    D'accord, donc, ma seule solution, c'est Ajax. J'utilise JQuery.
    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function export(){                 
      $.ajax({
          type: "POST",
          url: "export",
          async:true,
          data:$("#tableau_de_bord"),
              success: function(msg){
              unlockPage();
              alert(msg);
          }
      });
    }
    J'arrive à avoir le déverouillage de la page lorsque l'appel Ajax se termine (ce qui est déjà un bon point).
    Je dois donner les informations d'un formulaire qui contient des checkbox. Selon les checkbox qui sont cochées, le serveur crée un fichier à télécharger différent (d'ou le "data:").
    Cela dit, cela fonctionne encore mal. Une fois ma requête lancé, mon serveur part en boucle infini, il n'arrête jamais son traitement. Alors que c'est la même requête que j'effectuais auparavant avec le submit, je ne comprends pas. Y aurait-il une différence entre les deux ?

    Autre chose, une fois que j'aurai résolu ce problème (si je le résous), je ne sais pas comment faire pour que la fenêtre de téléchargement apparaisse. Que dois-je faire de la réponse de l'appel ajax ?

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par Climoo
    J'arrive à avoir le déverouillage de la page lorsque l'appel Ajax se termine (ce qui est déjà un bon point).
    ...
    Cela dit, cela fonctionne encore mal. Une fois ma requête lancé, mon serveur part en boucle infini, il n'arrête jamais son traitement. Alors que c'est la même requête que j'effectuais auparavant avec le submit, je ne comprends pas. Y aurait-il une différence entre les deux ?
    C'est un peu contradictoire : si tu as le déverrouillage, c'est que tu es entré dans le success, donc que la réponse est arrivée et que le serveur a fini son traitement, donc qu'il n'est pas dans une boucle infini
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  9. #9
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Oui exact, je me suis un peu embrouillé ! En fait j'ai réussi à avoir un retour (et donc pas de boucle infini), mais c'était seulement quand je ne cochais aucune checkox (dans ce cas, il ne génère pas de fichier, donc j'avais bien un retour).

    Je vais continuer de chercher pour la boucle infini, en revanche, pour ce qui est de quoi faire au retour de l'appel Ajax, je ne sais pas du tout comment faire...

  10. #10
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    ben c'est pas simple car c'est à l'opposé de la philosophie du navigateur.

    fonctionnement du navigateur avec HTTP

    tu invoque le submit dans ta page
    Le navigateur envoie la requête au serveur
    le serveur envois l'entête de la réponse
    le navigateur comprends que c'est un téléchargement
    Il passe la main au download manager du navigateur et rends la main à la page courante
    le serveur envois les données
    le download manager les reçois
    lorsque tout est arrivé le download manager t'affiche une notif ou une boite de dialogue.

    donc dans ton javascript tu as immanquablement la main avant la fin du téléchargement.
    et c'est indémerdable.

    Avec AJAX
    tu es dans ta page et tu active l'action
    XMLHTTPRequest envois une requête et rands la main au javascript
    le serveur la reçois et retourne l'entête
    le composant XMLHTTPRequest garde l'entête et l'analyse
    le serveur envoie les données
    le composant XMLHTTPRequest les garde en mémoire (dans le cache au pire si pas assez de mémoire)
    Le serveur à tout envoyé et ferme la connexion
    XMLHTTPRequest détecte la fin de la transaction et active la méthode success

    les données ne sont donc pas allées dans le fichier mais dans XMLHTTPRequest mais tu as eut un évènement à la fin du chargement.

    la solution
    tu active ton submit
    la requête par sur le serveur
    le serveur place dans la session un indicateur de chargement de fichier et commence le traitement il envois l'entête au navigateur
    qui la relais au download manager et rand la main à la page
    le js de celle-ci continu en lançant une requête de vérification de façon périodique.
    à la réception de cette requête le serveur regarde l'indicateur dans la session et retourne false si le téléchargement est toujours en cours
    pendant ce temps la réponse à la première requête envois les données.
    lors que toutes les données sont arrivées le serveur ferme la connexion et marque l'indicateur dans la session à terminé.

    la requête ajax périodique arrive une nouvelle fois.
    le serveur la reçois et trouve l'indicateur à terminé. il le supprime et retourne true
    AJAX reçois la réponse true et peu donc libérer la page

    A+JYT

  11. #11
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    OK, merci beaucoup pour votre aide !
    Je comprends bien pourquoi ce n'est pas possible avec un submit classique ou un Ajax tout simple. La solution avec des appels périodiques me parait assez lourde (et pas forcément fiable) à mettre en place (enfin c'est mon avis).
    La solution retenue (qui n'en est pas une), va être de lancer le téléchargement depuis une autre fenêtre, avec un message particulier à l'intérieur, et un sablier... Ça aura uniquement l'avantage de ne pas bloquer complétement l'utilisateur.

    Merci encore pour votre aide.

  12. #12
    Membre éprouvé
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Par défaut
    Je déterre le sujet car j'ai été confronté au même problème et je suis resté bloqué un moment avant de trouver quelque chose que j'ai jugé satisfaisant.
    Au final j'ai utilisé les cookies.
    Je m'explique:
    - le navigateur lance le téléchargement et lance en javascript un timer (setInterval(verifyCookie, 1000) qui va vérifier toutes les secondes la présence d'un cookie qui marque la fin du téléchargement.
    - lorsque mon serveur renvoi le fichier il renvoi en même temps un cookie nommé "fichierOK" par exemple
    - le navigateur reçoit le fichier et le cookie
    - ma fonction javascript "verifyCookie" détecte la présence du cookie "fichierOK", elle débloque donc la page et supprime le cookie et le tour est joué.

    Cette solution est a mon avis plus simple que d'envoyer des requêtes ajax pour connaitre le statut du traitement côté serveur. En effet elle ne nécessite que la gestion d'un timer et d'un cookie côté javascript et l'ajout d'un cookie à la réponse renvoyée par le serveur.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    Citation Envoyé par tenpigs Voir le message
    - le navigateur lance le téléchargement et lance en javascript un timer (setInterval(verifyCookie, 1000)
    lol, je suis pas tout seul!
    http://www.developpez.net/forums/d12...fraichir-page/

    Citation Envoyé par stof Voir le message
    variable côté Java positionnée à true quand besoin de rafraîchir et côté jsp une surveillance régulière (toutes les x secondes) de cette variable pour lancer ensuite un refresh de la page...

  14. #14
    Membre éprouvé
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Par défaut
    en prod depuis ce matin, pas magnifique mais ça marche

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. deux bouton submit dans même formulaire
    Par sansouna24 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/05/2006, 11h03
  2. plusieurs boutons submit sur un formulaire
    Par clement42 dans le forum Struts 1
    Réponses: 1
    Dernier message: 12/05/2006, 10h42
  3. PB de retour de valeur dans formulaire
    Par Poutchou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 05/04/2006, 16h10
  4. Problème retour à la ligne dans formulaire
    Par Mysti¢ dans le forum Langage
    Réponses: 1
    Dernier message: 03/04/2006, 13h34
  5. Un submit pour plusieurs formulaires
    Par beufa dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 29/11/2005, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo