Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: jose1996vs en 19 de Abril 2017, 11:05
-
Hola, estoy en una función de javascript, y al hacer la comunicacion con el servidor de php, tal como hace en el curso de "Ajax desde cero" (http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=922:ajax-ejemplo-sencillo-basico-codigo-objeto-xmlhttprequest-recuperar-datos-archivo-en-servidor-cu01206f&catid=83&Itemid=212), no entra en la función onreadystatechange. He copiado el código tal cual así que no sé qué está fallando...¿alguna idea?
Mi código:
alert("Justo antes del httprequest");
xmlhttp = new XMLHttpRequest();
alert("Ha pasado el httprequest");
xmlhttp.onreadystatechange = function () {
alert("Dentro de onreadystate, antes del if");
if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
var respuestadeenvio = xmlhttp.responseText;
alert("La respuesta es" + respuestadeenvio);
} else {
alert("No ha funcionado el if de readyState");
}
alert("Justo pasado la funcion de onreadystate");
xmlhttp.open("GET", "nombredemiarchivo.php?variablequellega=" + variablequerecojopreviamenteconunpromt);
xmlhttp.send();
para saber hasta qué punto llegaba, he puesto alerts, y llega hasta el de "ha pasado el httprequest", por lo que no entra en la función onreadystate y se queda parado.
Bueno GRACIAS!
-
Hola jose1996vxs
He probado el código y funciona perfectamente.
¿Lo estás probando en un servidor?
¿obtienes algún tipo de error en la consola?
Saludos. ;D
-
Hola,
¿Con funciona perfectamente te refieres a que te entra en la función y te salen los alerts?
Pues mira estoy en un servidor local, instalé MAMP, y no sé si será ese el problema, pero como dije en el mensaje inicial, copié el código del ejemplo de Ajax, y cuando hice ese ejemplo, me funcionaba perfectamente.
Lo acabo de volver a hacer y me sigue sin funcionar, en la consola no me aparece nada y además acabo de volver a hacer el ejemplo de aprenderaprogramar de Ajax y funciona o sea que no parece ser el servidor. No sé qué puede ser...También he probado con Chrome y Safari por si eso era el problema.
Gracias por la respuesta.
-
Pon el código entero que estés usando.
-
Hola,
Pues es que tampoco te creas que hay mucho más...o sea el resto del código no influye para nada en esto. Le doy a un botón en mi página web, y activo este javascript, en el cual pido un correo usando la función prompt y le muestro al usuario un confirm para que compruebe si lo ha escrito bien...y después ya llega esto, si el usuario le ha dado a aceptar:
function validarcorreo() {
'use strict';
var correo = prompt("Introduce tu correo");
var confirmar = confirm('El correo introducido es ' + correo + ' pulse OK para enviar, o Cancelar para volverlo a escribir');
if (confirmar === true) {
alert("Has dado a aceptar");
alert("Justo antes del httprequest");
xmlhttp = new XMLHttpRequest();
alert("Ha pasado el httprequest");
xmlhttp.onreadystatechange = function () {
alert("Dentro de onreadystate, antes del if");
if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
var respuestadeenvio = xmlhttp.responseText;
alert("La respuesta es" + respuestadeenvio);
} else {
alert("No ha funcionado el if de readyState");
}
alert("Justo pasado la funcion de onreadystate");
xmlhttp.open("GET", "borradorPHP.php?destinatario=" + correo);
xmlhttp.send();
}
}else {
alert("has dado a cancelar");
}
}
borradorPHP.php es el nombre del archivo, que no es más que un archivo que envía un correo, te lo adjunto por si acaso pero vamos que éste tampoco es el problema:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
$para=$_REQUEST["destinatario"];
$titulo = 'INFORMACIÓN';
$mensaje = 'Hola, \nhas recibido este correo porque has dado clic en mi página';
$cabeceras = 'From: otrocorreo@hotmail.com' . "\r\n" .
'Reply-To: hola@undominio.com\n' .
'X-Mailer: PHP/' . phpversion();
mail($para, $titulo, $mensaje, $cabeceras);
if (mail($para, $titulo, $mensaje, $cabeceras)) {
echo "Correo enviado y con éxito";
} else {
echo "No se ha podido enviar";
}
Bueno...hasta aquí ya sabes lo mismo que yo, así que espero que consigas resolverlo. Como ves, a priori no parece que haya nada extraño, y parece un ejemplo bastante sencillo...pero el problema parece estar en la función onreadystate.
Sobra decir que muchísimas gracias por tu atención y tu tiempo
-
Si usas 'use strict' todas las variables tienen que ser creadas con var. En tu código aparece esto:
xmlhttp = new XMLHttpRequest();
y en la consola te tiene que dar el siguiente error:
Uncaught ReferenceError: xmlhttp is not defined
Además tienes otra serie de errores, esta parte:
xmlhttp.open("GET", "tercero.php?destinatario=" + correo);
xmlhttp.send();
No puede ir dentro de la función onreadystatechange, si está dentro ella nunca se producirá un cambio de estado en xmlhttp.
También dentro de:
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
si añades el else, esa parte se ejecutará 3 veces sin ningún sentido, porque lo que nos interesa es recoger la respuesta cuando se cumpla la condición que se coloca en el if.
Te dejo el código:
function validarcorreo() {
'use strict';
var correo = prompt("Introduce tu correo");
var confirmar = confirm('El correo introducido es ' + correo + ' pulse OK para enviar, o Cancelar para volverlo a escribir');
if (confirmar === true) {
alert("Has dado a aceptar");
alert("Justo antes del httprequest");
var xmlhttp = new XMLHttpRequest();
alert("Ha pasado el httprequest");
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var respuestadeenvio = xmlhttp.responseText;
console.log(respuestadeenvio);
alert("La respuesta es" + respuestadeenvio);
}/* else {
console.log(respuestadeenvio);
alert("No ha funcionado el if de readyState");
}*/
// alert("Justo pasado la funcion de onreadystate");
// xmlhttp.open("GET", "tercero.php?destinatario=" + correo);
// xmlhttp.send();
}
xmlhttp.open("GET", "borradorPHP.php?destinatario=" + correo); // Esta parte no puede ir dentro de onreadystatechange
xmlhttp.send();
} else {
alert("has dado a cancelar");
}
}
Saludos. ;D
-
Hola,
¡MENUDO ERROR MÁS TONTO! Mil gracias, menudo error lo de haber puesto el send dentro de onreadystate, además estoy seguro que lo revisé varias veces, pero con tanto lío de corchetes...Gracias de verdad.
Ya se mete en todas las funciones correctamente, de todas formas, por si te interesa, ocurre algo muy extraño, y es que no se envía el correo aunque pone que si se envía. Pero lo más extraño aun es que esto solo pasa a veces, y no es problema de la conexión Javascript-php, porque si me meto en "borradorPHP" directamente (cambiando el destinatario), tampoco se envía.
Te cuento esto por si acaso da la casualidad de que sabes algo acerca de este problema. ¡De todas formas muchas gracias por tu tiempo!