problema con php cargado en un div con jquery

N

hola.. muy buenas..

Primero decir que soy nueva aquí y saludar a todo el mundo.. he venido a 'aprovecharme' un poquito de los conocimientos de por aqui..

Tengo un problema que está amargandome la semana...

Os cuento:
Estoy con una página en la que tengo un menú (que no se mueve nunca) y un div central donde se carga todo el contenido, todas las páginas, hasta ahí, todo bien.

Cargo el contenido con jquery, y las páginas cargadas que llevan jquery a su vez, funcinan de maravilla... el PROBLEMA viene.. cuando estas páginas algo de php (ej: mandar un email) o son enteras con php... cuando doy al submit, lo que me pasa es: o me lleva directamente al index... ó no hace nada...

Estas páginas funcionan perfectamente cargadas ellas solas en el navegador.

Alguien tiene alguna idea de que me puede pasar???

por favor por favor... :( una ayudita...

Mujiwara

No me he enterado muy bien pero puedo deducir, que tienes problemas con los submit?

Solo tienes que hacer algo tipo
$("#idDelForm" ).submit(function() {
función ajax para enviar el formulario
});

N

hola.. intento explicarme mejor...

Tengo un formulario para inscribirse... tienen que poner nombre y email, lo valido y muestro si hay error con jquery, y si esta bien lo meto en la base de datos y muestro que esta todo bien.. todo funciona muy bien si la página del formulario la abro ella sola en el navegador.. el problema viene, cuando esta página (la del formulario) la muestro en el div central cargada de forma dinamica con jquery. entonces no funciona correctamente.

1 respuesta
Mujiwara

Tienes que usar la función .live, te explico:
Cuando cargas cosas con AJAX (jQuery) el document window no "se actualiza" y tienes que tirar del .live para poder hacerlo, algo así:
$("#idDelForm" ).live("submit",function() {
función ajax para enviar el formulario
});

Entonces, ahora detectara el formulario cargado con jQuery.

1 respuesta
Kiroushi

#3 You're doing it wrong. No puedes cargar un php con jquery, el jquery tiene que enviar un post a un php que te devuelva lo que quieres que te salga en el div.

#4 Creo que no se refiere a eso. Y por cierto, el live está obsoleto.

1 respuesta
Mujiwara

#5 Obsoleto o no, funciona :D
Se puede tirar de .delegate que creo que es el nuevo o el .on.
Y creo que si se refiere a eso, la muestro en el div central cargada de forma dinamica con jquery. entonces no funciona correctamente.
Eso es porque el document window no lo ha detectado y se tiene que tirar de funciones extra como .live, .delegate, .on, .bind o el que no este obsoleto ¬¬'

Kiroushi

Esta intentando cargar un php que probablmente no tenga ni un print o un echo que devuelva el contenido al div, diría yo, pero bueno.

N

Lo cargo con este código:

$(document).ready(function(){
$("#nav li").each(function(event){
$(this).on('click','ul a',function(event){
event.preventDefault();
var href = $(this).attr("href");

$("#centro").load(href);

return false;

});
});
});

y todas las páginas que utilizan jquery cargadas asi, funcionan bien... lo que no va bien es el php

N

uuummmm no te habia entendido bien Mujiwara...voy a probar

N

kiroushi.... ummm... explicamelo mejor... porque el formulario funciona perfectamente si lo pruebo fuera de la página index...

1 respuesta
Mujiwara

#10 El archivo PHP que cargas con jQuery aparece bien no? el problema está en que no te detecta el submit del formulario y así no puedes notificar los errores en la misma página, es lo que he entendido yo, ¿es eso?

N

bueno.. vamos mejorando... jeje.. ahora, poniendo lo que tu me has dicho ( live() ).. ha pasado de no hacer nada... a.. mandarme al index.. osea.. me carga el index.. PEEERO.. si yo le doy a actualizar ... lo que hace es salirme la alerta de cuando actualizas un formulario... como si toda la página fuese un formulario...

¿me has entendido algo?... jeje

Mujiwara

¿Que función utilizas para mandar el formulario?
tiene que ser algo así:
$.ajax({
cache: false,
type: $(this).attr('method'),
data:$(this).serialize,
url: $(this).attr('action'),
success: function(data){
alert(data);
}
});

Se supone que esto tendría que mandar el formulario y devolverte lo que te dice el PHP en un alert (msgbox).

N

por cierto, muchas gracias por tu interes...

N

codigo html

<!DOCTYPE HTML>
<html>
<head>
<title>WebTursos | Formulario de Contacto AJAX usando jQuery + PHP</title>
<link rel="stylesheet" href="estiloscorreo23.css" />
<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="funcionescorreo2.js"></script>

</head>
<body>
<center><a href="http://web.tursos.com/?p=4971">&larr; Volver al tutorial</a></center>
<form method="post" class="contacto">
<fieldset>
<div><label>Nombre:</label><input type="text" class="nombre" name="nombre" /></div>
<div><label>Email:</label><input type="text" class="email" name="email" /></div>
<div><label>Telefono:</label><input type="text" class="telefono" name="email" /></div>
<div><label>Mensaje:</label><textarea cols="30" rows="5" class="mensaje" name="mensaje" ></textarea></div>
<div class="ultimo">
<img src="ajax.gif" class="ajaxgif hide" />
<div class="msg"></div>
<button class="boton_envio" id="boton_envio">Enviar Mensaje</button>
</div>
</fieldset>
</form>
</body>
</html>

esta es la página que cargo en el div...

y ahora te pongo el js que valida:

$(document).ready(function(){
//$(".boton_envio").click(function() {
$("#boton_envio").live("submit",function()){

	var nombre = $(".nombre").val();
		email = $(".email").val();
		validacion_email = /^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/;
		telefono = $(".telefono").val();
		mensaje = $(".mensaje").val();
	
	if (nombre == "") {
	    $(".nombre").focus();
	    return false;
	}else if(email == "" || !validacion_email.test(email)){
	    $(".email").focus();	
	    return false;
	}else if(telefono == ""){
	    $(".telefono").focus();
	    return false;
	}else if(mensaje == ""){
	    $(".mensaje").focus();
	    return false;
	}else{
		aler("dentro de correo");
		$('.ajaxgif').removeClass('hide');
		var datos = 'nombre='+ nombre + 
					'&email=' + email + 
					'&telefono=' + telefono + 
					'&mensaje=' + mensaje;
		$.ajax({
    		type: "POST",
    		url: "procesocorreo2.php",
    		data: datos,
    		success: function() {
				$('.ajaxgif').hide();
      			$('.msg').text('Mensaje enviado!').addClass('msg_ok').animate({ 'right' : '130px' }, 300);	
    		},
			error: function() {
				$('.ajaxgif').hide();
      			$('.msg').text('Hubo un error!').addClass('msg_error').animate({ 'right' : '130px' }, 300);					
			}
   		});
 		return false;	
	}
});

});

y este procesa

<?php
// Guardar los datos recibidos en variables:
$nombre = $POST['nombre'];
$email = $
POST['email'];
$telefono = $POST['telefono'];
$mensaje = $
POST['mensaje'];
// Definir el correo de destino:
$dest = "[email protected]";

// Estas son cabeceras que se usan para evitar que el correo llegue a SPAM:
$headers = "From: $nombre $email\r\n";
$headers .= "X-Mailer: PHP5\n";
$headers .= 'MIME-Version: 1.0' . "\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Aqui definimos el asunto y armamos el cuerpo del mensaje
$asunto = "Contacto";
$cuerpo = "<strong>Nombre:</strong> ".$nombre."<br>";
$cuerpo .= "<strong>Email:</strong> ".$email."<br>";
$cuerpo .= "<strong>Telefono:</strong> ".$telefono."<br>";
$cuerpo .= "<strong>Mensaje:</strong> ".$mensaje;

// Esta es una pequena validación, que solo envie el correo si todas las variables tiene algo de contenido:
//if($nombre != '' && $email != '' && $telefono != '' && $mensaje != ''){
mail($dest,$asunto,$cuerpo,$headers); //ENVIAR!
//}
?>

Mujiwara

Fíjate:
<form method="post" class="contacto">
Y aquí:
$("#boton_envio").live("submit",function()){
Que lo cambiamos por:
$(".contacto").live("submit",function(){ (<-fíjate aquí porque creo que estas poniendo mas los paréntesis.)

Y aquí:
<button class="boton_envio" id="boton_envio">Enviar Mensaje</button>
Que lo cambiamos por:
<button class="boton_envio" id="boton_envio" type="submit">Enviar Mensaje</button>

N

:( ...sigue haciendo lo mismo...

(pero madre que fallos tenia) gracias.. :)

Li3cht

Compañeros, usad las etiquetas [.code] [./code] sin los puntos, que el código es infumable. Un saludo.

N

perdón perdón... que no me habia fijado en ello...

N

Voy a poner otro código que también he probado y que por si solo funciona (osea, que si lo abres en una pagina aparte sola en el navegador va bien) en el momento que cargo la página dentro del div, deja de funcionar correctamente..

<html>
	<head>
		<title>Contacto</title>
		<link rel='stylesheet' href='estilos22.css'>
		<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js'></script>
		<script src='funciones22.js'></script>
	</head>
	<body>
	<?php
		if(isset($_POST['boton'])){
			if($_POST['nombre'] == ''){
				$error1 = '<span class="error">Ingrese su nombre</span>';
			}else if($_POST['email'] == '' or !preg_match("/^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/",$_POST['email'])){
				$error2 = '<span class="error">Ingrese un email correcto</span>';
			}else if($_POST['asunto'] == ''){
				$error3 = '<span class="error">Ingrese un asunto</span>';
			}else if($_POST['mensaje'] == ''){
				$error4 = '<span class="error">Ingrese un mensaje</span>';
			}else{			
				$dest = "[email protected]"; //Email de destino
				$nombre = $_POST['nombre'];
				$email = $_POST['email'];
				$asunto = $_POST['asunto']; //Asunto
				$cuerpo = $_POST['mensaje']; //Cuerpo del mensaje
				//Cabeceras del correo
				$headers = "From: $nombre $email\r\n"; //Quien envia?
				$headers .= "X-Mailer: PHP5\n";
				$headers .= 'MIME-Version: 1.0' . "\n";
				$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; //
				
			if(mail($dest,$asunto,$cuerpo,$headers)){
				$result = '<div class="result_ok">Email enviado correctamente :)</div>';	
				// si el envio fue exitoso reseteamos lo que el usuario escribio:
				$_POST['nombre'] = '';
				$_POST['email'] = '';
				$_POST['asunto'] = '';
				$_POST['mensaje'] = '';
			}else{
				$result = '<div class="result_fail">Hubo un error al enviar el mensaje :(</div>';
			}
		}
	}
?>
	<form class='contacto' method='POST' action=''>
		<div><label>Tu Nombre:</label><input type='text' class='nombre' name='nombre' value='<?php echo $_POST['nombre']; ?>'><?php echo $error1 ?></div>
		<div><label>Tu Email:</label><input type='text' class='email' name='email' value='<?php echo $_POST['email']; ?>'><?php echo $error2 ?></div>
		<div><label>Asunto:</label><input type='text' class='asunto' name='asunto' value='<?php echo $_POST['asunto']; ?>'><?php echo $error3 ?></div>
		<div><label>Mensaje:</label><textarea rows='6' class='mensaje' name='mensaje'><?php echo $_POST['mensaje']; ?></textarea><?php echo $error4 ?></div>
		<div><input type='submit' value='Envia Mensaje' class='boton' name='boton'></div>
		<?php echo $result; ?>
	</form>
</body>
</html>

Usuarios habituales