Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Duda Javascript [En tiempo de ejecucion]

Estas en el tema de Duda Javascript [En tiempo de ejecucion] en el foro de Javascript en Foros del Web. Al grano tengo la siguiente pagina de prueba: Código HTML: <!DOCTYPE html> <html> <head> <meta charset= "UTF-8" > <title> Archivo Principal </title> <script type= "text/javascript" ...
  #1 (permalink)  
Antiguo 04/01/2015, 00:08
 
Fecha de Ingreso: diciembre-2014
Ubicación: montería
Mensajes: 33
Antigüedad: 9 años, 10 meses
Puntos: 0
Pregunta Duda Javascript [En tiempo de ejecucion]

Al grano tengo la siguiente pagina de prueba:
Código HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Archivo Principal</title>
        <script type="text/javascript" src="ajax.js"></script>
        <script type="text/javascript">
            ejecutame = function() {
                ajax("java.php","variable=hola");
            }
            validame = function() {
                var h = document.getElementById("divpru").innerHTML;
                alert(h);
            }
        </script>
    </head>
    <body>
        <button onclick="ejecutame();">ejecutame</button>
        <button onclick="validame();">validame</button>
    </body>
</html> 
estaba intentando hacer un truco con la respuesta de mi función ajax, al retornar el mismo dentro de una variable string. Sin embargo presente muchos inconvenientes «OJO no tengo problemas con la petición, ni la respuesta. Solo deseo tratar dicha respuesta como un dato tipo string»

En fin la pregunta es el código anterior tal como esta funciona, la función ajax llamada desde el enlace crea un nuevo elemento en el DOM con el id "divpru" y la función validame asigna el contenido en el nuevo elemento a una variable. Ahora si modifico el código así:

Código HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Archivo Principal</title>
        <script type="text/javascript" src="ajax.js"></script>
        <script type="text/javascript">
            ejecutame = function() {
                ajax("java.php","variable=hola");

                var h = document.getElementById("divpru").innerHTML;
                alert(h);
            }
        </script>
    </head>
    <body>
        <button onclick="ejecutame();">ejecutame</button>
    </body>
</html> 
el resultado del alert es vacío. ¿Porque se presenta esta peculiaridad?
  #2 (permalink)  
Antiguo 04/01/2015, 01:43
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Duda Javascript [En tiempo de ejecucion]

Eso sucede porque las dos líneas siguientes se ejecutan antes de que se termine de procesar la petición asíncrona. Tendrías que agregarlas en el bloque de código dentro de la función en donde proceses dicha respuesta.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 04/01/2015, 11:00
 
Fecha de Ingreso: diciembre-2014
Ubicación: montería
Mensajes: 33
Antigüedad: 9 años, 10 meses
Puntos: 0
Busqueda Respuesta: Duda Javascript [En tiempo de ejecucion]

Cita:
Iniciado por Alexis88 Ver Mensaje
Tendrías que agregarlas en el bloque de código dentro de la función en donde proceses dicha respuesta.
Es muy curios veras estoy haciendo todo aqui afuera por que dentro de la funcion ajax tampoco funciona, te muestro:

Código Javascript:
Ver original
  1. function ajax(url, dato, metodo) {
  2.     dato = dato || "";
  3.     metodo = metodo || "POST";
  4.  
  5.   var xmlhttp = ObjetoXMLHttpRequest();//Se crea el objeto para manejar la conexión AJAX
  6.  
  7.   //Función que va a procesar la petición al servidor en caso de que se espere respuesta
  8.   xmlhttp.onreadystatechange=function(){
  9.     if( xmlhttp.readyState == 4 && xmlhttp.status == 200 ){
  10.       respuesta = new String();
  11.       respuesta = '"'+xmlhttp.responseText+'"';
  12.       respuesta = (eval(respuesta));
  13.       midiv = document.createElement('div');
  14.       midiv.id = "divpru";
  15.       midiv.innerHTML = respuesta;
  16.       document.body.appendChild(midiv);
  17.  
  18.      //estando aqui dentro intento leer el recién-contenido del div
  19.      var midato = document.getElementById("divpru").innerHTML;
  20.      alert(midato);
  21.      
  22.     }
  23.   }
  24.  
  25.   //Apertura para el envío de la petición
  26.   xmlhttp.open(metodo,url,true);
  27.   xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  28.   xmlhttp.send(dato);
  29. }

tampoco es que tenga un buen resultado con xmlhttp.open(metodo,url,false);

EDIT: Aclaración, te preguntaras por que tanto embrollo en crear un elemento div para luego pasarle el valor de la variable respuesta que bien puedo implementar así:

Código Javascript:
Ver original
  1. alert(respuesta);

¿Funcionaria? Si... Estamos claros, pero realmente no quiero aplicar un alert quiero trabajar con el contenido de esa variable lo que deseo es hacer algo así como:

Código Javascript:
Ver original
  1. return respuesta; //Entiendase como un return xmlhttp.responseText; o similar...

Puesto que dicha idea no ha sido posible se me ocurrió que si el contenido lo puedo pasar a un elemento del DOM:
Código Javascript:
Ver original
  1. document.getElementById("divpru").innerHTML = xmlhttp.responseText;
  2. //Poteriormente leer el cntenido del elemento creado
  3. return document.getElementById("divpru").innerHTML;
  4. .
  5. .
  6. //Fuera de la librería podría hacer algo como:
  7. var mivariable = ajax("java.php","variable=hola");
  8.  
  9. HagoLoQueQuieroCon(mivariable);

Esto que requiero actualmente lo hago con jQuery, pero la verdad solo implemento jQuery para usar ajax y nada mas, deseo usar RequiredJs me ha gustado la idea de controlar mis módulos y jQuery me ha dado problemas para integrarse puesto que no maneja el modelo AMD. Por ello no quiero una solución JQuery

Gracias por la atención prestada.

Última edición por NeaFan; 04/01/2015 a las 11:18 Razón: Aclaracion...
  #4 (permalink)  
Antiguo 04/01/2015, 18:30
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Duda Javascript [En tiempo de ejecucion]

No estoy seguro de que tenga mucho que ver, pero esto no es necesario:

Código Javascript:
Ver original
  1. respuesta = new String();
  2. respuesta = '"'+xmlhttp.responseText+'"';

Puesto que responseText indica que estás recibiendo texto plano. Las comas y crear un objeto String están de más.

Por otro lado, ten cuidado con ejecutar la misma función varias veces porque terminarías creando varios elementos con el mismo id y eso no es correcto ya que se trata de un dato único.

¿Y qué tal si pruebas retornando esto?

Código Javascript:
Ver original
  1. return xmlhttp.responseText;

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 05/01/2015, 13:10
 
Fecha de Ingreso: diciembre-2014
Ubicación: montería
Mensajes: 33
Antigüedad: 9 años, 10 meses
Puntos: 0
Busqueda Respuesta: Duda Javascript [En tiempo de ejecucion]

Hola, esta fracción que muestro no es todo mi código .
Claro que se que a creación de un elemento una y otra vez con el mismo ID no debe ser, por ello en mi código completo elimino el elemento recién creado la creación del mismo la hago puesto que por alguna razón esto no funciona:

Código Javascript:
Ver original
  1. return xmlhttp.responseText;

en cuanto a esta linea:

Código Javascript:
Ver original
  1. respuesta = '"'+xmlhttp.responseText+'"';

solo era una medida desesperada por respetar el contenido completamente, puesto que si mi respuesta fuese algo como esto:

Código Javascript:
Ver original
  1. var respuesta = '<!DOCTYPE html>
  2. <html>
  3.    <head>
  4.        <meta charset="UTF-8">
  5.        <title>Frame Contenedor</title>
  6.    </head>
  7.    <body>
  8.        <a href="frame2.php" target="miframe2">iniciar frame 2</a>
  9.        <iframe id="miframe2" name="miframe2"></iframe>
  10.    </body>
  11. </html>';

De seguro algunas etiquetas se eliminarían y algunos de los caracteres del contenido no se respetarían »Descuida ya lo solucione» De echo conseguí completar mi implementación de una manera bastante aceptable.
  #6 (permalink)  
Antiguo 05/01/2015, 17:55
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Duda Javascript [En tiempo de ejecucion]

Cita:
Iniciado por NeaFan Ver Mensaje
Descuida, ya lo solucione. De echo conseguí completar mi implementación de una manera bastante aceptable.
¿Podrías mostrarnos cómo lo conseguiste? Quizá otros usuarios tengan el mismo problema que tuviste y aquí podrían encontrar la solución.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 05/01/2015, 21:06
 
Fecha de Ingreso: diciembre-2014
Ubicación: montería
Mensajes: 33
Antigüedad: 9 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Duda Javascript [En tiempo de ejecucion]

Esta es la solución que implemente:
http://www.forosdelweb.com/f13/aporte-ajax-sin-librerias-1117722/

En cuanto a la respuesta:
Cita:
Iniciado por Alexis88 Ver Mensaje
Eso sucede porque las dos líneas siguientes se ejecutan antes de que se termine de procesar la petición asíncrona. Tendrías que agregarlas en el bloque de código dentro de la función en donde proceses dicha respuesta.
Aunque no aclare del todo mi duda, creo que esta respuesta estubo muy cerca y teniendo en cuenta que solucione el problema que incentivo la duda. daré el tema como solucionado.

Etiquetas: ajax, dom, ejecucion, funcion, innerhtml, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:18.