49 votes

Redirection de la page après une demande Ajax réussie

J'ai un formulaire qui utilise Ajax pour la vérification côté client. La fin du formulaire est la suivante :

$.ajax({
        url: 'mail3.php',
        type: 'POST',
        data: 'contactName=' + name + '&contactEmail=' + email + '&spam=' + spam,

        success: function(result) {
            //console.log(result);
            $('#results,#errors').remove();
            $('#contactWrapper').append('<p id="results">' + result + '</p>');
            $('#loading').fadeOut(500, function() {
                $(this).remove();

            });

        }
    });

EDIT : voici mon fichier mail3.php qui traite les erreurs :

$errors=null; 

if ( ($name == "Name") ) {
    $errors = $nameError; // no name entered
}
if ( ($email == "E-mail address") ) {
    $errors .= $emailError; // no email address entered
}
if ( !(preg_match($match,$email)) ) {
    $errors .= $invalidEmailError; // checks validity of email
}
if ( $spam != "10" ) {
    $errors .= $spamError; // spam error
}

if ( !($errors) ) {
    mail ($to, $subject, $message, $headers);
    //header ("Location: thankyou.html");
    echo "Your message was successfully sent!";
    //instead of echoing this message, I want a page redirect to thankyou.html

} else {
    echo "<p id='errors'>";
    echo $errors;
    echo "</p>";
}

Je me demandais s'il était possible de rediriger l'utilisateur vers une page de remerciement si la requête ajax est réussie et qu'aucune erreur n'est présente. Est-ce possible ?

Merci ! Amit

0 votes

2 votes

@Andrea : Ce n'est pas un doublon car j'essaie de rediriger la page seulement si aucune erreur n'est présente. Si des erreurs sont présentes, je veux qu'il écrive ces erreurs.

0 votes

Cela répond-il à votre question ? Comment rediriger une page en jQuery ?

47voto

Adam Points 14766

Bien sûr. Il suffit de mettre quelque chose à la fin de votre fonction de succès comme :

if(result === "no_errors") location.href = "http://www.example.com/ThankYou.html"

où votre serveur renvoie la réponse no_errors lorsqu'il n'y a pas d'erreurs présentes.

3 votes

Une utilisation appropriée des codes d'état HTTP fera de chaque succès un succès sans que le serveur ait à renvoyer des messages.

2 votes

@Jeremy- C'est vrai, à moins que vous ne vouliez renvoyer des messages d'erreur spécifiques pour que le site puisse les traiter ou même des URL différentes à rediriger en cas d'échec. Ces messages devraient être renvoyés avec un code de réponse 200, ce qui nécessiterait une réponse no_errors pour les différencier.

0 votes

En fait, à première vue, il me semble que cette méthode pourrait fonctionner !

21voto

tj111 Points 12313

Faites juste quelques vérifications d'erreurs, et si tout se passe bien, alors mettez window.location pour rediriger l'utilisateur vers une autre page.

$.ajax({
    url: 'mail3.php',
    type: 'POST',
    data: 'contactName=' + name + '&contactEmail=' + email + '&spam=' + spam,

    success: function(result) {
        //console.log(result);
        $('#results,#errors').remove();
        $('#contactWrapper').append('<p id="results">' + result + '</p>');
        $('#loading').fadeOut(500, function() {
            $(this).remove();

        });

        if ( /*no errors*/ ) {
            window.location='thank-you.html'
        }

    }
});

0 votes

Comment puis-je vérifier l'absence d'erreurs si toutes les erreurs sont traitées par le fichier mail3.php ?

1 votes

Vous devriez piéger les erreurs dans votre fichier mail3.php, et renvoyer un code d'état de 500 sur votre réponse.

1 votes

Pourriez-vous développer un peu ? Comment faire exactement pour renvoyer ce code d'état de 500 ?

15voto

Nick Craver Points 313913

Vous pouvez simplement rediriger dans votre success comme ceci :

window.location.href = "thankyou.php";

Ou, puisque vous affichez des résultats, attendez quelques secondes, par exemple 2 secondes :

setTimeout(function() {
  window.location.href = "thankyou.php";
}, 2000);

0 votes

Pourriez-vous jeter un coup d'œil à mon édition pour voir comment je peux gérer le scénario d'absence d'erreur ? Je veux seulement qu'il soit redirigé vers thankyou.php si aucune erreur n'est présente.

0 votes

@Amit - Vous pourriez mettre if(result === "Your message was successfully sent!") avant ça, qui n'enverrait que dans ces cas-là.

3voto

morels Points 1633
$.ajax({
        url: 'mail3.php',
        type: 'POST',
        data: 'contactName=' + name + '&contactEmail=' + email + '&spam=' + spam,

        success: function(result) {

            //console.log(result);
            $('#results,#errors').remove();
            $('#contactWrapper').append('<p id="results">' + result + '</p>');
            $('#loading').fadeOut(500, function() {
                $(this).remove();

            });

            if(result === "no_errors") location.href = "http://www.example.com/ThankYou.html"

        }
    });

2voto

Nitin Hurkadli Points 21

J'ai posté la même situation sur un autre fil. Re-postez.

Excusez-moi, ce n'est pas une réponse à la question posée ci-dessus.

Mais cela amène un sujet intéressant --- QUAND utiliser AJAX et quand NE PAS utiliser AJAX. Dans ce cas, il est bon de ne pas utiliser AJAX.

Prenons un exemple simple de login et de mot de passe. Si le nom d'utilisateur et/ou le mot de passe ne correspondent pas, il serait bien d'utiliser AJAX pour renvoyer un simple message disant "Login Incorrect". Mais si le login et le mot de passe sont corrects, pourquoi devrais-je appeler une fonction AJAX pour rediriger vers la page de l'utilisateur ?

Dans un cas comme celui-ci, je pense qu'il serait bon d'utiliser un simple formulaire SUBMIT. Et si la connexion échoue, rediriger vers Relogin.php qui ressemble à Login.php avec un message GET dans l'url comme Relogin.php?error=InvalidLogin... quelque chose comme ça...

Juste mes deux centimes :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X