Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > HTML, Javascript y otros
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Ejecutar función de JavaScript a partir del nombre de su identificador (string)

Hola,

Estoy tratando de organizarme mejor cuando utilizo el objeto "XmlHttpRequest". Resulta que quisiera "abstraer" la petición HTTP de lo que ha de hacerse con el resultado de esta. Así me gustaría contar con una función (o una clase, pero, esto ya se verá más adelante) que se encargara sólo de realizar la petición HTTP mediante el objeto mencionado.

A la función (o método de la clase) le pasaría varios parámetros, conviene a saber: el método de la petición HTTP, la URL a la que enviar le petición, los pares de variables/valor correspondientes, y... y aquí está la madre del cordero, el nombre de una función que hiciera a modo de "callback" y a la que la función encargada de la petición HTTP llamaría a su vez cuando esta se completara, por ejemplo.

Ya he hecho varias pruebas al respecto, y, lo primero que me pregunté es cómo podía ejecutar una función en JavaScritp a partir del nombre de su identificador disponible en una variable de tipo string, claro. Esto me consta que puede hacerse, pero, lo vi vaya usted saber dónde y además buscando por Internet no he conseguido nada que me sacara del apuro...

El caso es que he llegado a poder ejecutar la función de este modo:

Código:
function PeticionHttp('get', 'http://url', 'variable=valor', 'FuncionCallBack')
{
  // Omitimos el resto del código
  
  eval(FuncionCallBack +'()'+);

  // Omitimos el resto del código
}
Es decir, he conseguido ejecutar la función utilizando a su vez la función "eval" de JavaScript, peeeeeeeeeeeero...

A dicha función "CallBack" tengo que pasarle unos parámetros... un par de ellos, y, aunque esto es posible usando "eval" para ejecutar la función, lo cierto es que uno de ellos me causaba problemas, porque se trata de no poco código HTML lo que contiene, y eso son muchas comillas dobles, simples, barras invertidas, sin invertir...

Errores, en definitiva, relativos a que el parámetro no llegaba en condiciones de ser utilizado. ¡Pero amigo! Como estaba acercándome al objetivo me dije, hombre, David, ya que pasas un parámetro pásalo bien... ¿porqué no pasas la instancia del objeto "XmlHttpRequest" y a partir de ahí le sacas el jugo que necesites desde la función "CallBack" correspondiente?

Ajá. Mi gozo en un pozo. No he conseguido pasar el objeto susomentado a la función "CallBack". ¡Y el caso es que llega "algo" del mismo, incluso da la impresión de que ahí está, porque lo que un "alert" reza sobre el parámetro de la función "CallBack" es el tipo del objeto que estamos pasando como parámetro! Pero ninguna de sus propiedades parece estar disponible, todas están "undefined".

Y digo yo si no habrá otra forma de ejecutar una función como lo preciso usando otra cosa que no sea la función "eval" de JavaScript. O si alguno de vosotros se ha topado con algún problema similar a este y recuerda algo que pueda echarme una mano. No corre ninguna prisa, por cierto.

Bueno. Si necesitáis más información no dudéis en hacérmelo saber. Gracias a todos de antemano y que paséis un buen día.

Para Román: me parece que alguna vez tratamos sobre el objeto "XmlHttpRequest" en el Foro de moderadores y tú preparaste cierto código que, desafortunadamente no he podido encontrar (y es raro, porque suelo guardar este tipo de información). Creo recordar incluso que algo tenía que ver con lo que quiero hacer, en cuanto a que usabas en el mismo alguna función a modo de "CallBack"). Por favor, Román, si lo encuentras por ahí y crees que tiene que ver sé tan amable de copiarlo por aquí. ¡Gracias!

Posdatas: No sé si en JavaScript se podrán pasar parámetros por referencia. Por otro lado viendo que era posible que tuviera algo que ver que la función que hace la petición HTTP declarara como local la variable que contiene la instancia del objeto "XmlHttpRequest", traté de declarar esa variable como global, pero, ni por esas, la cosa no terminaba bien tampoco.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 23-08-2006 a las 14:05:16.
Responder Con Cita
  #2  
Antiguo 23-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
La verda es que me es difícil seguir el hilo y al final no nos dices cómo estás pasando el parámetro.

Aquí te pongo un ejemplo que me funciona:

Código:
/*
  crea un objeto HttpRequest
*/
function createRequest()
{
  // no implementada, simplemente debe crear
  // el objeto según el navegador que se use
}

/*
  manda una petición HTTP via ajax

  recibe una función "callback" que se llamará en cuanto se
  tenga respuesta. La función callback recibe como parámetro
  al objeto HTTPRequest.
*/
peticionHttp(url, callBack)
{
  // creamos el objeto HTTPRequest
  request = createRequest();
  
  // le asignamos el manejador de eventos
  request.onreadystatechange = function()
  {
    // si todo está bien y muy bien...
    if (request.readyState == 4 && request.status == 200)
    {
      // llamamos de vuelta
      eval(callBack + '(request)');
    }
  }

  // enviamos la petición
  request.open('get', url, true);
  request.send();
}
Un ejemplo de uso:

Código:
/*
  ejemplo simplón de callback.
  simplemente muestra la respuesta de la petición
*/
function procesaRespuesta(request)
{
  alert(request.responseText);
}

/*
  Lanzamos la petición
*/
peticionHttp('http://servidor/pagina.php', 'procesaRespuesta');
// Saludos
Responder Con Cita
  #3  
Antiguo 23-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Gracias por responder Román.

Cita:
La verda es que me es difícil seguir el hilo y al final no nos dices cómo estás pasando el parámetro.
No me extraña, lo escribí ayer a última hora de la... mañana, luego de la tarde y noche y madrugada sin dormir, liado con Loturak, ya sabes (*).

No puedo deciros cómo paso el parámetro de marras, porque, efectivamente, no he conseguido hacerlo, así que, de momento, hacemos las cosas no como querríamos, sino como nos es posible...

Una cosa sí puedo decir, y es que tengo que hacer más pruebas y las haré, porque, ¿lo que tú has escrito arriba funciona? Haces uso de la función "eval" y pasas el objeto "XmlHttpRequest" como parámetro, pero, ¿comprobaste que funciona?

Lo digo porque, eso, entre otras cosas, es lo que yo intenté, pero, es lo que digo arriba, que se recibe, aparentemente, el objeto pasado como parámetro, ¡pero sus propiedades son "undefined"! Así que, ¿probaste el código anterior o sólo intuyes que funcionará?

En todo caso gracias por responder Román. Veo que acaso no exista otra forma de hacer esto que con "val", en JavaScript.... bueno. Como sea habría que apañarse.


(*) En realidad no hay excusa que valga.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 23-08-2006 a las 23:07:07.
Responder Con Cita
  #4  
Antiguo 23-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
¿lo que tú has escrito arriba funciona? Haces uso de la función "eval" y pasas el objeto "XmlHttpRequest" como parámetro, pero, ¿comprobaste que funciona?
Por supuesto. No acostumbro publicar código de más de dos líneas que no haya probado antes.

Agrego:

Justamente en la función "callback" de prueba usé request.responseText en lugar de simplemente request, para que no quedara duda.

// Saludos

Última edición por roman fecha: 23-08-2006 a las 23:10:22.
Responder Con Cita
  #5  
Antiguo 23-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno... Pues entonces tendré que prestar atención y comprobarlo de nuevo. Voy a hacerlo esta vez fuera del proyecto, por separado, para ver si así las cosas se me presentan más claras. Dices que funciona... y te creo, ¡y a mí que me parecía hasta sintácticamente incorrecto! Por ejemplo, cuando haces esto:

Código:
eval(callBack + '(request)');
¿No se están mezclando churras con merinas? ¿No está ahí mezclándose una cadena (los paréntesis) y el identificador del objeto "request"? Yo puedo jurar que hize algo muy similar y no me funcionó, como he dicho, pero, en fin, te agradezco tu respuesta Román. Voy a tratar de intentar de nuevo a ver, que seguro que ahora va bien.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 23-08-2006 a las 23:24:26.
Responder Con Cita
  #6  
Antiguo 23-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Eso similar que hiciste es difícil saber qué fue. En la declaración de la función PeticionHttp, ¿te has fijado como has declarado los parámetros?.

En cuanto a la sintaxis, callBack es una cadena, al igual que '(request)', así que el parámetro que se le pasa a eval es la cadena

'procesaRespuesta(request)'

JS no es PHP, no hay- que yo sepa -evaluación de variables dentro de una cadena.

Ahora, yo probé el código en IE y te aseguro que funciona. Por lo que dices, me he puesto a probar en FF y no funciona pero, bueno, en FF no funcionan muchas cosas.

// Saludos
Responder Con Cita
  #7  
Antiguo 23-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

¡Estupendo! ¡Comprobado y alucinado de su funcionamiento y posibilidades!

Ahora bien, se ve que tengo que aprender sobre la función "eval" de JavaScript. Yo creo que aquí es donde estaba metiendo la pata, puesto que algo como lo que escribiste funciona:

Código:
eval(callbackfunc+'(request)');
Pero, yo estaba empeñado en hacer algo similar a esto:

Código:
eval(callbackfunc+'('+request+')');
Y bueno, algunas otras cosas más intenté, pero, ninguna con el éxito que ahora he tenido al hacerlo como dices. Muchas gracias otra vez Román. Ahora se ve que puedo ir pensando en cómo llevar a cabo el asunto, puesto que parece posible y hacedero. Gracias otra vez.

PD. Lo probé en FireFox, por cierto.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 23-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Curioso, yo lo he hecho funcionar en FF pero sólo pasando null al método request.send().

Si tú haces callbackfunc + '(' + request + ')', eso sí que son churros con merinas (¿qué son merinas?): estás sumando cadenas de caracteres con objetos.

Pero si esto te confunde, ¿qué tal si te digo que también funciona si pones:

Código:
eval(callBack(request));
así, sin comillas, pero llamando a la función también sin comillas:

Código:
peticionHttp('http://servidor/pagina.php', procesaRespuesta);
// Saludos
Responder Con Cita
  #9  
Antiguo 24-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Curioso, yo lo he hecho funcionar en FF pero sólo pasando null al método request.send().
Te refieres a cuando se hace uso del método "GET" en la petición HTTP... pues no sé qué decirte, acabo de probarlo, por curiosidad, y en FireFox 1.5 funciona bien de ambos modos: con null y sin null.

Cita:
Si tú haces callbackfunc + '(' + request + ')', eso sí que son churros con merinas (¿qué son merinas?): estás sumando cadenas de caracteres con objetos.
Desde luego, no es que tuviera que haberlo supuesto, es que si hubiera mirado en la documentación de JavaScript sobre la función "eval" creo que hubiera dado con el asunto, pero, desafortunadamente para mí, JavaScript lo tengo un poco abandonado... peor para mí, ya digo.

Respecto de la no necesidad de utilizar las benditas comillas... ¡es estupendo! Porque te quitas de los líos que pueden suponer y el código fuente queda bastante más legible y serio, me parece a mí. Gracias de nuevo Román (estoy seguro de que estaré picando código un buen rato antes de que se me ocurra pasar por la documentación de JavaScript,... si es que...)...

PD. Churras y merinas.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 24-08-2006 a las 00:05:26.
Responder Con Cita
  #10  
Antiguo 24-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por roman
eso sí que son churros con merinas (¿qué son merinas?)
Las churras y las merinas son dos razas de ovejas distintas, de hay la expresión "mezclar churras con merinas"
Responder Con Cita
  #11  
Antiguo 24-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ja, ja, ja. Yo leí churro

Responder Con Cita
  #12  
Antiguo 24-08-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 21
kayetano Va por buen camino
Hola

Mira por donde he encontrado una web muy chula sobre el tema:
http://www.challenger.se
puedes sacar alguna idea del script que utiliza
http://www.challenger.se/include/js/xdbc.js
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente
Responder Con Cita
  #13  
Antiguo 24-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Kayetano
Mira por donde he encontrado una web muy chula sobre el tema:
Gracias Kayetano.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear Instancias a partir de un nombre radaalvaro .NET 10 14-04-2009 23:22:32
Partir un string FunBit Varios 5 25-07-2005 17:58:32
ejecutar PHP o javascript desde delphi torito Varios 3 11-03-2005 17:48:37
Conocer PrinterIndex a partir del nombre Novás Varios 1 16-07-2004 18:26:14
Ejecutar javascript en Intraweb Brewster Internet 1 17-06-2004 22:55:38


La franja horaria es GMT +2. Ahora son las 01:57:43.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi