2010-08-18 6 views
30

Tengo un formulario que usa Ajax para la verificación del lado del cliente. El final del formulario es el siguiente:Redirección de página con solicitud de Ajax satisfactoria

$.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: este es mi archivo mail3.php tratamiento de errores:

$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>"; 
} 

Me preguntaba si es posible redireccionar al usuario a una página de agradecimiento página si la solicitud ajax es exitosa y no hay errores presentes. es posible?

Gracias! Amit

+0

duplcate de http://stackoverflow.com/questions/3430877/how-do-i-redirect-a-page-jquery –

+1

@Andrea: No es un duplicado porque estoy tratando de reorientar la página solo si no hay errores. Si hay errores, quiero que escriba esos errores. – Amit

Respuesta

28

Claro. Sólo hay que poner algo en el final de la función de su éxito como:

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

donde el servidor devuelve la respuesta no_errors cuando no hay errores presentes.

+2

El uso adecuado de códigos de estado HTTP hará que todos los éxitos sean un éxito sin que el servidor tenga que devolver ningún mensaje. –

+1

@ Jeremy- Es cierto, a menos que desee devolver mensajes de error específicos para el sitio para tratar o incluso diferentes URL para redirigir a la falla. Esos mensajes tendrían que ser devueltos con un código de respuesta 200 que requiera una respuesta no_errors para diferenciar. – Adam

+0

¡En realidad, desde el primer vistazo, me parece que este método funcionaría! – Amit

9

Usted sólo puede redirigir en el controlador success, así:

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

O ya está mostrando resultados, espere unos segundos, por ejemplo, esto sería esperar 2 segundos:

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

¿Podría echar un vistazo a mi edición para ver cómo puedo lidiar con el escenario sin error? Solo quiero que se redireccione a thankyou.php si no hay errores. – Amit

+0

@Amit - Podría poner 'if (resultado ===" Su mensaje fue enviado correctamente! ")' Antes de esto, eso solo enviaría en esos casos. –

0

creo que se puede hacer eso con:

window.location = "your_url"; 
0

I supongamos que pudieras atacar esto de dos maneras;

1) inserte window.location = 'http://www.yourdomain.com en la función de éxito.

2) utilizar una llamada ajax, además, un Inyectarlo en un elemento en su página, más información sobre la que se pueden encontrar en la documentación de jQuery en http://api.jquery.com/jQuery.get/

14

Simplemente haga una comprobación de errores, y si todo pasa, configure window.location para redirigir al usuario a otra página.

$.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

¿Cómo puedo verificar si no hay errores si todos los errores se procesan a través del archivo mail3.php? – Amit

+1

debe atrapar errores en su archivo mail3.php y devolver un código de estado de 500 en su respuesta. –

+0

¿Podría elaborar un poco? ¿Cómo devuelvo exactamente este código de estado de 500? – Amit

2

En el archivo mail3.php usted debe capturar los errores en un try {} catch {}

try { 
    /*code here for email*/ 
} catch (Exception $e) { 
    header('HTTP/1.1 500 Internal Server Error'); 
} 

Entonces en su llamada success usted no tendrá que preocuparse de sus errores, ya que nunca lo hará regresa como un exito

y puede usar: window.location.href = "thankyou.php"; dentro de su función de éxito como lo indicó Nick.

-1
// Create lag time before redirecting 
setTimeout(function() { 
    window.location.href = "thankyou.php"; 
}, 2000); 

$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); 
    echo "Your message was successfully sent!"; 
    //instead of echoing this message, I want a page redirect to thankyou.html 
    // redirect 
    setTimeout(); 
} else { 
    echo "<p id='errors'>"; 
    echo $errors; 
    echo "</p>"; 
} 
+1

Proporcione sus comentarios, no solo el código – ekostadinov

+0

ekostadinov - El código tiene comentarios, pero está bien! –

0

He publicado la situación exacta en un hilo diferente. Volver a publicar

Disculpe, esta es una respuesta a la pregunta publicada anteriormente.

Pero trae un tema interesante --- CUANDO usar AJAX y cuándo NO usar AJAX. En este caso, es bueno no usar AJAX.

Tomemos un ejemplo simple de inicio de sesión y contraseña.Si el nombre de usuario y/o la contraseña no coinciden, sería bueno usar AJAX para informar un mensaje simple que dice "Login Incorrect". Pero si el nombre de usuario y la contraseña SON correctos, ¿por qué tendría que volver a llamar a una función AJAX para redireccionar a la página del usuario?

En un caso como este, creo que sería agradable utilizar un formulario simple SOMETER. Y si el inicio de sesión falla, redirigir a Relogin.php que se ve igual que el Login.php con un mensaje GET en la url como Relogin.php? Error = InvalidLogin ... algo así ...

Just my 2 centavos. :)

2
$.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" 

     } 
    }); 
Cuestiones relacionadas