11499 sujets

JavaScript, DOM et API Web HTML5

Bonjour à toutes et tous,

Pas du tout expert en développement, j'essaye de me débrouiller...

Je rencontre un petit soucis sur un formulaire de contact, 3 champs texte, nom, email, message et un bouton envoi. Lors de l'envoi d'un message tout se passe bien jusqu'à la réception de l'envoi mais sur la page web du site, le message "envoi du message Patientez..." reste figé et rien ne se rafraîchit. Avez vous une idée du problème s'il vous plait?

Si il vous le code je vous l'enverrai.

Dino.
toukilbv a écrit :
Bonjour dno,

Aurais-tu un bout de code sur-lequel on puisse jeté un coup d’œil?




Voici les codes:

html:

<div class="row">
    <div class="twelve columns contact-wrap">
      <div class="content-title-wrap1">
        <h3>Reach <span>us</span></h3>
      </div>
      <div class="space40"></div>
      <div class="six columns">
        <form id="contactForm" action="http://monadresse.com/contact.php" method="post">
          <ul>
            <li>
              <!-- Prefix label -->
              <div class="row collapse">
                <div class="two mobile-one columns"> <span class="prefix"><span class="contact-ico">+</span></span> </div>
                <div class="ten mobile-three columns">
                  <input type="text"  name="senderName" id="senderName" placeholder="Your full name" required="required" maxlength="40"/>
                </div>
              </div>
            </li>
            <li>
              <!-- Prefix label -->
              <div class="row collapse">
                <div class="two mobile-one columns"> <span class="prefix"><span class="contact-ico">%</span></span> </div>
                <div class="ten mobile-three columns">
                  <input type="email" name="senderEmail" id="senderEmail" placeholder="Type your valid email address" required="required" maxlength="50" />
                </div>
              </div>
            </li>
            <li>
              <textarea name="message" id="message" placeholder="Your message" required="required" cols="60" rows="10" maxlength="10000"></textarea>
            </li>
          </ul>
          <div id="formButtons">
            <input type="submit" id="sendMessage" name="sendMessage" value="Send it" />
          </div>
        </form>
        <div id="sendingMessage" class="statusMessage">
          <p>Sending your message. Please wait</p>
        </div>
        <div id="successMessage" class="successmessage">
          <p><span class="success-ico">W</span> Thanks for sending your message! 	We'll get back to you shortly.</p>
        </div>
        <div id="failureMessage" class="errormessage">
          <p><span class="error-ico">[</span> There was a problem sending your message. Please try again.</p>
        </div>
        <div id="incompleteMessage" class="statusMessage">
          <p>Please complete all the fields in the form before sending.</p>
        </div>
      </div>
      <div class="six columns	">
        <div class="contact-info">



CONTACT.JS


var messageDelay = 2000;  // How long to display status messages (in milliseconds)

// Init the form once the document is ready
$( init );


// Initialize the form

function init() {

  // Hide the form initially.
  // Make submitForm() the form's submit handler.
  // Position the form so it sits in the centre of the browser window.
  $('#contactForm').show().submit( submitForm ).addClass( 'positioned' );

  // When the "Send us an email" link is clicked:
  // 1. Fade the content out
  // 2. Display the form
  // 3. Move focus to the first field
  // 4. Prevent the link being followed

  $('a[href="#contactForm"]').click( function() {
    $('#contactForm').fadeTo( 'slow', .2 );
    $('#contactForm').fadeIn( 'slow', function() {
      $('#senderName').focus();
    } )

    return false;
  } );
  
}



// Submit the form via Ajax

function submitForm() {
  var contactForm = $(this);

  // Are all the fields filled in?

  if ( !$('#senderName').val() || !$('#senderEmail').val() || !$('#message').val() ) {

    // No; display a warning message and return to the form
    $('#incompleteMessage').fadeIn().delay(messageDelay).fadeOut();
    contactForm.fadeOut().delay(messageDelay).fadeIn();

  } else {

    // Yes; submit the form to the PHP script via Ajax

    $('#sendingMessage').fadeIn();
    contactForm.fadeOut();

    $.ajax( {
      url: contactForm.attr( 'action' ) + "?ajax=true",
      type: contactForm.attr( 'method' ),
      data: contactForm.serialize(),
      success: submitFinished
    } );
  }

  // Prevent the default form submission occurring
  return false;
}


// Handle the Ajax response

function submitFinished( response ) {
  response = $.trim( response );
  $('#sendingMessage').fadeOut();

  if ( response == "success" ) {

    // Form submitted successfully:
    // 1. Display the success message
    // 2. Clear the form fields
    // 3. Fade the content back in

    $('#successMessage').fadeIn().delay(messageDelay).fadeOut();
    $('#senderName').val( "" );
    $('#senderEmail').val( "" );
    $('#message').val( "" );

    $('#contactForm').delay(messageDelay+500).fadeIn();

  } else {

    // Form submission failed: Display the failure message,
    // then redisplay the form
    $('#failureMessage').fadeIn().delay(messageDelay).fadeOut();
    $('#contactForm').delay(messageDelay+500).fadeIn();
  }
}


PHP:

<?php

// Define some constants
define( "RECIPIENT_NAME", "MONSITE" );
define( "RECIPIENT_EMAIL", "info@monadresse.com" );
define( "EMAIL_SUBJECT", "Visitor Message" );

// Read the form values
$success = false;
$senderName = isset( $_POST['senderName'] ) ? preg_replace( "/[^\.\-\' a-zA-Z0-9]/", "", $_POST['senderName'] ) : "";
$senderEmail = isset( $_POST['senderEmail'] ) ? preg_replace( "/[^\.\-\_\@a-zA-Z0-9]/", "", $_POST['senderEmail'] ) : "";
$message = isset( $_POST['message'] ) ? preg_replace( "/(From:|To:|BCC:|CC:|Subject:|Content-Type:)/", "", $_POST['message'] ) : "";

// If all values exist, send the email
if ( $senderName && $senderEmail && $message ) {
  $recipient = RECIPIENT_NAME . " <" . RECIPIENT_EMAIL . ">";
  $headers = "From: " . $senderName . " <" . $senderEmail . ">";
  $success = mail( $recipient, EMAIL_SUBJECT, $message, $headers );
}

// Return an appropriate response to the browser
if ( isset($_GET["ajax"]) ) {
  echo $success ? "success" : "error";
} else {
?>
<html>
  <head>
    <title>Thanks!</title>
  </head>
  <body>
  <?php if ( $success ) echo "<p>Thanks for sending your message! We'll get back to you shortly.</p>" ?>
  <?php if ( !$success ) echo "<p>There was a problem sending your message. Please try again.</p>" ?>
  <p>Click your browser's Back button to return to the page.</p>
  </body>
</html>
<?php
}
?>

Modifié par 6l20 (15 Jul 2013 - 09:25)
Je ne suis pas très famillier avec la syntaxe que tu utilises pour l'ajax, es-tu sur que ta fonction "submitFinished" est appelé?
Tu peux faire un alert au début pour être sûr.

Je verrai plus un truc comme ça :

$.ajax( {
url: contactForm.attr( 'action' ) + "?ajax=true",
type: contactForm.attr( 'method' ),
data: contactForm.serialize(),
success: function(msg){ 
	submitFinished(msg);
});


Mais dans tout les cas, si ton mail est bien envoyé c'est que le soucis est dans ta fonction submitFinished, ce qui empeche ta div de disparaître...
Modifié par toukilbv (11 Jul 2013 - 11:52)
toukilbv a écrit :
Je ne suis pas très famillier avec la syntaxe que tu utilises pour l'ajax, es-tu sur que ta fonction &quot;submitFinished&quot; est appelé?
Tu peux faire un alert au début pour être sûr.

Je verrai plus un truc comme ça :

$.ajax( {
url: contactForm.attr( 'action' ) + &quot;?ajax=true&quot;,
type: contactForm.attr( 'method' ),
data: contactForm.serialize(),
success: function(msg){ 
	submitFinished(msg);
});


Mais dans tout les cas, si ton mail est bien envoyé c'est que le soucis est dans ta fonction submitFinished, ce qui empeche ta div de disparaître...




J'ai essayé mais cela ne change rien, je vais chercher du côté submitFinished .... en espérant trouver en tout cas merci pour ta réponse.

Dino
Bonjour,
La piste de toukilbv me semble être la bonne... As-tu essayé de placer la déclaration de ta fonction submitFinished AVANT son appel (il me semble que l'interpréteur lit bêtement le script de haut en bas).
Sinon, écris la directement dans le success:
$.ajax( {
url: contactForm.attr( 'action' ) + &quot;?ajax=true&quot;,
type: contactForm.attr( 'method' ),
data: contactForm.serialize(),
success: function(msg){ 
	msg = $.trim( msg );
        $('#sendingMessage').fadeOut();
        //etc.
});
GroquikMLV a écrit :
Bonjour,
La piste de toukilbv me semble être la bonne... As-tu essayé de placer la déclaration de ta fonction submitFinished AVANT son appel (il me semble que l'interpréteur lit bêtement le script de haut en bas).
Sinon, écris la directement dans le success:
$.ajax( {
url: contactForm.attr( 'action' ) + &amp;quot;?ajax=true&amp;quot;,
type: contactForm.attr( 'method' ),
data: contactForm.serialize(),
success: function(msg){ 
	msg = $.trim( msg );
        $('#sendingMessage').fadeOut();
        //etc.
});





J'ai recopier de nouveau la formule de toukilbv

le message part et le navigateur m'affiche cela par contre quand je reviens en arrière les champs texte ne sont pas rafraîchits

upload/50697-030.jpg
Alors là je ne comprends pas trop le truc... L'intérêt d'utiliser ajax, c'est de ne pas avoir à changer de page (enfin personnellement, je l'utilise pour ça). Or dans ton cas, tu fais ta requête ajax, puis tu changes page pour dire "ok ça a marché, cliquez sur précédent pour revenir".

Pourquoi tu ne rajoutes pas une <div class="ajax-ok">Merci d'avoir envoyé un message</div> en hidden, et que tu passe en visible dans la fonction success? Ca te permettrait de rester toujours sur ta page de formulaire, et ça éviterait de charger une nouvelle page indiquant le succès et demandant de cliquer sur "précédent".
GroquikMLV a écrit :
Alors là je ne comprends pas trop le truc... L'intérêt d'utiliser ajax, c'est de ne pas avoir à changer de page (enfin personnellement, je l'utilise pour ça). Or dans ton cas, tu fais ta requête ajax, puis tu changes page pour dire &quot;ok ça a marché, cliquez sur précédent pour revenir&quot;.

Pourquoi tu ne rajoutes pas une &lt;div class=&quot;ajax-ok&quot;&gt;Merci d'avoir envoyé un message&lt;/div&gt; en hidden, et que tu passe en visible dans la fonction success? Ca te permettrait de rester toujours sur ta page de formulaire, et ça éviterait de charger une nouvelle page indiquant le succès et demandant de cliquer sur &quot;précédent&quot;.




Je t'invite à lire mon premier poste pour comprendre mon soucis.

Dino
GroquikMLV a raison, je ne comprend pas pk tu demande à cliquer sur back.

Tes champs sont bien vider par ton code mais en cliquant sur back, tu les re-remplis Smiley biggol

Je suis en train de me perdre un peu dans ton code : la page html que tu as mis en premier et la page contact.php sont une seule et même page ou non?

Je pense voir ce que tu veux faire mais je crois que tu t’emmêle les pinceaux entre l'ajax et la validation du formulaire. Ton site serait-il en ligne?
Modifié par toukilbv (11 Jul 2013 - 17:07)
toukilbv a écrit :
GroquikMLV a raison, je ne comprend pas pk tu demande à cliquer sur back.

Tes champs sont bien vider par ton code mais en cliquant sur back, tu les re-remplis Smiley biggol

Je suis en train de me perdre un peu dans ton code : la page html que tu as mis en premier et la page contact.php sont une seule et même page ou non?

Je pense voir ce que tu veux faire mais je crois que tu t’emmêle les pinceaux entre l'ajax et la validation du formulaire. Ton site serait-il en ligne?



Bonsoir,
Mes champs se vident bien et je reçois mes mails, mais le pb c'est que lorsque que l'on clic sur le bouton envoi, le mail part et simultanément tu vois apparaître le petit message du genre envoi de votre message Attendez s'il vous plait et c'est là que ça coince. Non il n'est pas en ligne enfin si mais pas avec le formulaire puisqu'il ne fonctionne pas, en attendant j'ai juste mis un lien mailto. Ce sont 2 pages.
dno a écrit :

le message part et le navigateur m'affiche cela par contre quand je reviens en arrière les champs texte ne sont pas rafraîchits

dno a écrit :

Mes champs se vident bien et je reçois mes mails, mais le pb c'est que lorsque que l'on clic sur le bouton envoi, le mail part et simultanément tu vois apparaître le petit message du genre envoi de votre message Attendez s'il vous plait et c'est là que ça coince.


Tu te contredis Smiley rolleyes
Ce que je te conseil : dans ton fichier php, le seul echo que tu dois faire c'est une chaine de caractère disant "succes" ou "erreur" et tu utilise les options de la fonction ajax :
- beforeSend : Avant l'envoi de l'ajax -> "Envoi du mail en cours, merci de patienter"
- error : Echec de l'envoi de l'ajax -> "Erreur réseau merci de rééssayer"
- success : succès de l'ajax
-> si mail partis : "Mail envoyé avec succès, vous allez être redirigé vers le formulaire" puis tu renvoi vers ton formulaire (raffraichissement)
-> si mail pas partis : "Echec envoi du mail..." et tu peux faire une redirection aussi

Mais dans ta page php, fais juste le traitement, pck là tu as plusieurs fois le même affichage dans ton fichier html et ton fichier php...
toukilbv a écrit :



Tu te contredis Smiley rolleyes
Ce que je te conseil : dans ton fichier php, le seul echo que tu dois faire c'est une chaine de caractère disant &quot;succes&quot; ou &quot;erreur&quot; et tu utilise les options de la fonction ajax :
- beforeSend : Avant l'envoi de l'ajax -&gt; &quot;Envoi du mail en cours, merci de patienter&quot;
- error : Echec de l'envoi de l'ajax -&gt; &quot;Erreur réseau merci de rééssayer&quot;
- success : succès de l'ajax
-&gt; si mail partis : &quot;Mail envoyé avec succès, vous allez être redirigé vers le formulaire&quot; puis tu renvoi vers ton formulaire (raffraichissement)
-&gt; si mail pas partis : &quot;Echec envoi du mail...&quot; et tu peux faire une redirection aussi

Mais dans ta page php, fais juste le traitement, pck là tu as plusieurs fois le même affichage dans ton fichier html et ton fichier php...




Bonjour,

Je t'invite à visiter ce lien ce sera plus parlant.

Rempli le formulaire, clic sur send,

N'y a-t-'il pas un code en php ou ajax pour dire que quand l émail est parti revenir sur le formulaire avec les champs vides?


Dino.
Bonjour Dino,

Eh bien si, dans ta page php (celle appelé par ta fonction ajax) :

if(mail($to, $subject, $message, $headers)){
        echo 'ok';
} else {
        echo 'nok';
}


et dans ta fonction ajax :

$.ajax( {
url: contactForm.attr( 'action' ) + &amp;quot;?ajax=true&amp;quot;,
type: contactForm.attr( 'method' ),
data: contactForm.serialize(),
success: function(msg){
        if(msg == 'ok'){
             location.reload(); // rafraichi ta page et donc réaffiche ton formulaire vide
        } else {
             alert("l'email n'a pu être envoyé");
        }
});


Tu peux faire comme ça par exemple
toukilbv a écrit :
Bonjour Dino,

Eh bien si, dans ta page php (celle appelé par ta fonction ajax) :

if(mail($to, $subject, $message, $headers)){
        echo 'ok';
} else {
        echo 'nok';
}


et dans ta fonction ajax :

$.ajax( {
url: contactForm.attr( 'action' ) + &amp;amp;quot;?ajax=true&amp;amp;quot;,
type: contactForm.attr( 'method' ),
data: contactForm.serialize(),
success: function(msg){
        if(msg == 'ok'){
             location.reload(); // rafraichi ta page et donc réaffiche ton formulaire vide
        } else {
             alert(&quot;l'email n'a pu être envoyé&quot;);
        }
});


Tu peux faire comme ça par exemple



Bonjour

J'ai recopier ton code ajax a celui existant changer les modifs sur le php mais ça ne fonctionne pas. Au moment ou tu m'as envoyé le mail tu as vu le problème qui se passe, comment te l'expliques tu par rapport au code original?

Dino
Bonjour Dino,

Pour moi ton script plante au niveau de la fonction "SubmitFinished".
Le mail part donc l'ajax fonctionne.
T'as fais un alert sur la variable success pour voir ce qu'elle contient ?

Quand il m'arrive un truc comme ça que j'arrive pas à expliquer. Je cale des "alert" un peu partout pour voir ou le code passe et ou il ne passe pas. Je te conseil de faire la même : ainsi tu pourras cibler la ligne à partir de laquelle ton script plante.

Et je pense que le code précédent ne marche pas car ta page php renvoi plus que 'ok' ou 'nok', fais un alert dessus aussi Smiley lol
Modifié par toukilbv (16 Jul 2013 - 11:49)
toukilbv a écrit :
Bonjour Dino,

Pour moi ton script plante au niveau de la fonction &quot;SubmitFinished&quot;.
Le mail part donc l'ajax fonctionne.
T'as fais un alert sur la variable success pour voir ce qu'elle contient ?

Quand il m'arrive un truc comme ça que j'arrive pas à expliquer. Je cale des &quot;alert&quot; un peu partout pour voir ou le code passe et ou il ne passe pas. Je te conseil de faire la même : ainsi tu pourras cibler la ligne à partir de laquelle ton script plante.

Et je pense que le code précédent ne marche pas car ta page php renvoi plus que 'ok' ou 'nok', fais un alert dessus aussi Smiley lol



Bonjour,

j ai résolu mon problème juste en rajoutant un lien vers mon formulaire en cliquant sur celui je reviens sur ma page formulaire avec mes champs texte vidés mais j'aimerai savoir si tout peux se passer dans la même page. C 'est à dire au moment ou les champs texte sont remplis et que l'on clique sur envoi cela appelle une autre page avec le lien de retour et le message "envoi réussi" mais peut faire la même chose dans la page d'origine sans faire appel à une deuxième page, j'espère que je suis assez claire dans ma requête.

Dino.
dno a écrit :
j'aimerai savoir si tout peux se passer dans la même page. C 'est à dire au moment ou les champs texte sont remplis et que l'on clique sur envoi cela appelle une autre page avec le lien de retour et le message "envoi réussi" mais peut faire la même chose dans la page d'origine sans faire appel à une deuxième page


Oui tu peux, c'est ce que je t'ai proposé plus haut :
Utilise les options de la fonction ajax :

- beforeSend : Avant l'envoi de l'ajax -> Affiche div "beforeSend" et cache "formulaire"
- error : Echec de l'envoi de l'ajax -> Affiche div "erreurReseau" puis affiche formulaire
- success : succès de l'ajax
-> si mail partis : Affiche div "success"
-> si mail pas partis : Affiche div "erreurMail"
-complete : Exécuter à la fin de l'ajax (qq soit echec ou succès) -> Réaffiche ton formulaire avec une fonction qui s'éxécute au bout de 3secondes par exemples


<form id='formulaire'>
      //ton formulaire
</form>
<div id='beforeSend'>Envoi du mail, merci de patienter</div>
<div id='erreurReseau'>Erreur réseau, merci de rééssayer</div>
<div id='success'>Mail envoyé, merci de votre confiance</div>
<div id='erreurMail'>Erreur dans l'envoi du mail, merci de rééssayer</div>


Dans ta page php :

if(mail($to, $subject, $message, $headers)){
        echo 'ok';
} else {
        echo 'nok';
}//Il ne faut faire aucun autre echo dans cette page 
//Car tout se retrouve dans la variable "msg" de l'option success de la fonction ajax


Ta fonction ajax :
$.ajax( {
url: contactForm.attr( 'action' ) + &amp;amp;quot;?ajax=true&amp;amp;quot;,
type: contactForm.attr( 'method' ),
data: contactForm.serialize(),
error: function () {
        $('#beforeSend').hide();
        $('#erreurReseau').show();
},
beforeSend: function(){
        $('#formulaire').hide();
        $('#beforeSend').show();
},
success: function(msg){
        if(msg == 'ok'){
             $('#beforeSend').hide();
             $('#success').show();
        } else {
             $('#erreurMail').show();
        }
},
complete: function(){
             setTimeout(function(){
                     // vide tes champs ici
                    $('#formulaire').show();
              },3000);
}
});


Je t'invite a regarder la doc de la fonction Ajax de jquery pour bien comprendre les options de celle-ci.
C'est du code fait à la va vite sur le forum donc pas de copier/coller! Smiley langue
Adapte le à ta page.
En espérant t'avoir aider Smiley biggrin