Autor Tema: onreadystatechange Uncaught ReferenceError: xmlhttp is not defined CU01206F  (Leído 4779 veces)

jose1996vs

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
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:

Código: [Seleccionar]
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!
« Última modificación: 14 de Junio 2017, 18:57 por Ogramar »

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Re:función onreadystatechange
« Respuesta #1 en: 25 de Abril 2017, 10:36 »
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

jose1996vs

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Re:función onreadystatechange
« Respuesta #2 en: 25 de Abril 2017, 10:59 »
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.




pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Re:función onreadystatechange
« Respuesta #3 en: 25 de Abril 2017, 12:01 »
Pon el código entero que estés usando.


jose1996vs

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Re:función onreadystatechange
« Respuesta #4 en: 25 de Abril 2017, 12:26 »
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:

Código: [Seleccionar]
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:

Código: [Seleccionar]
<?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

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Re:función onreadystatechange
« Respuesta #5 en: 25 de Abril 2017, 13:17 »
Si usas 'use strict' todas las variables tienen que ser creadas con var. En tu código aparece esto:

Código: [Seleccionar]
xmlhttp = new XMLHttpRequest();
y en la consola te tiene que dar el siguiente error:
Citar
Uncaught ReferenceError: xmlhttp is not defined

Además tienes otra serie de errores, esta parte:

Código: [Seleccionar]
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:

Código: [Seleccionar]
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:
Código: [Seleccionar]
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

jose1996vs

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Re:función onreadystatechange
« Respuesta #6 en: 25 de Abril 2017, 13:48 »
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!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".