Foros del Web » Programando para Internet » Javascript »

Como no perder valor de parámetros pasados a funciones javascript

Estas en el tema de Como no perder valor de parámetros pasados a funciones javascript en el foro de Javascript en Foros del Web. Hola amigos, estoy teniendo unos problemas programanado una función javascript, os pongo a continuación el código y os digo lo que me pasa. Cita: function ...
  #1 (permalink)  
Antiguo 30/03/2011, 05:25
 
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 10 meses
Puntos: 0
Como no perder valor de parámetros pasados a funciones javascript

Hola amigos,

estoy teniendo unos problemas programanado una función javascript, os pongo a continuación el código y os digo lo que me pasa.

Cita:
function leerBD(p){

var url = "ajax.php";
var params = "p="+p;
var http = new XMLHttpRequest();
http.open("POST", url, true);

//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
alert(p);
http.onreadystatechange = function() {//Call a function when the state changes.



if(http.readyState == 4 && http.status == 200) {

var registros=http.responseText;
alert(registros);
alert("arriba de if");


if(p==1){

alert("en if");
/*Declaraciones*/
var h3 = document.createElement("h3");
var h2 = document.createElement("h2");
var p = document.createElement("p");
var enlace = document.getElementById("enlacesub1");
p.innerHTML=registros;
var subbox = document.getElementById("subbox1");
subbox.appendChild(p);
h3.innerHTML = "Experimento 1";
enlace.parentNode.insertBefore(h3,enlace); //insertamos antes del enlace
enlace.parentNode.inserteBefore(p,enlace);
}

}
http.send(params);
}
}
Entonces, el problema está en que se pierde el valor de la variable p cuando entra en
Cita:
http.onreadystatechange = function()
. En mi código html le paso un 1, y el valor no se pierde hasta donde he dicho.
¿Por qué puede ser? ¿Qué puedo hacer?

Gracias!
  #2 (permalink)  
Antiguo 30/03/2011, 07:06
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

es un problema de scope (ámbito de variable)
  #3 (permalink)  
Antiguo 30/03/2011, 09:43
 
Fecha de Ingreso: marzo-2011
Mensajes: 1
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

El problema está en esta linea
Código:
var p = document.createElement("p");
En javascript no existe el ámbito de bloque y la variable p es local en toda la función onreadystatechange, aunque este declarada en un bloque después de usarla. Y por lo tanto oculta la variable p del ámbito superior.

Por ejemplo:
Código:
var p=1;

function f() {
    alert(p);             // p = undefined
    if (0) {
	var p;
    }
}

f();
  #4 (permalink)  
Antiguo 30/03/2011, 13:23
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

Cita:
Iniciado por Jorge_sa Ver Mensaje
El problema está en esta linea
Código:
var p = document.createElement("p");
perdona que te corrija, pero el problema está aquí
Cita:
if(p==1){
  #5 (permalink)  
Antiguo 31/03/2011, 01:19
 
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

Muchas gracias por sus contestaciones, pero cómo podría solucionar esto? porque dependiendo del valor de p hago una cosa u otra, y claro es valor necesito saberlo. Muchas gracias a todos :)
  #6 (permalink)  
Antiguo 31/03/2011, 01:48
 
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

el problema está solucionado, o eso parece. Parece ser que es por la razón que decía Jorge_sa ;).Gracias a los dos de nuevo
  #7 (permalink)  
Antiguo 31/03/2011, 03:01
 
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

Buenas de nuevo, ahora me ha surgido otro problema, os lo pongo a continuación. Como os he dicho antes, dependiendo del valor de p hago una cosa u otra, vale hasta ahí todo correcto. Lo que pasa es que ahora sólo me imprime una vez en el html dependiendo de p. Os pongo el código js y html para que lo veais.

Cita:
function leerBD(p){
alert(p);
var url = "ajax.php";
var params = "p="+p;
var http = new XMLHttpRequest();
var h3;
var pr;
var enlace;
var subbox;
http.open("POST", url, true);

//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");

http.onreadystatechange = function() {//Call a function when the state changes.

if(http.readyState == 4 && http.status == 200) {
p2 = p;
alert("yejee"+p2);
var registros=http.responseText;
alert(registros);
alert("arriba de if");

alert(p);
if(p==1){

alert("en if");
/*Declaraciones*/
h3 = document.createElement("h3");
h2 = document.createElement("h2");
pr = document.createElement("p");
enlace = document.getElementById("enlacesub1");
pr.innerHTML=registros;
var subbox = document.getElementById("subbox1");
subbox.appendChild(pr);
h_3.innerHTML = "Experimento 1";
enlace.parentNode.insertBefore(h3,enlace); //insertamos antes del enlace


}//if

if(p==2){
alert("en if");
/*Declaraciones*/
h3 = document.createElement("h3");
h2 = document.createElement("h2");
pr = document.createElement("p");
enlace = document.getElementById("enlacesub2");
pr.innerHTML=registros;
subbox = document.getElementById("subbox2");
subbox.appendChild(pr);
h3.innerHTML = "Experimento 2";
enlace.parentNode.insertBefore(h3,enlace); //insertamos antes del enlace
}

}

}
http.send(params);
}
y el código html

Cita:
<script>
leerBD(1);
leerBD(2);
</script>
entonces si p=1 me debería de imprimir en div concreto, si p=2 en otro, pero todo a la vez, el problema está en que sólo me imprime si p=2.

Muchas gracias
  #8 (permalink)  
Antiguo 31/03/2011, 04:00
 
Fecha de Ingreso: enero-2007
Mensajes: 146
Antigüedad: 17 años, 9 meses
Puntos: 16
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

Si sólo llamas a leerBD(1); te imprime en el div 1 o no te imprime nada? Si te imprime en el div 1, luego prueba con leerBD(2); únicamente, y por último llamando primero a leerBD(2) y luego leerBD(1) a ver si en ésta ocasión te imprime en el div1 únicamente.
  #9 (permalink)  
Antiguo 31/03/2011, 04:14
 
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

Cita:
Iniciado por WeSoRz Ver Mensaje
Si sólo llamas a leerBD(1); te imprime en el div 1 o no te imprime nada?
Me imprime bien.

Cita:
Iniciado por WeSoRz Ver Mensaje
Si te imprime en el div 1, luego prueba con leerBD(2)únicamente,
Me imprime bien, es decir en el div que corresponde

Cita:
Iniciado por WeSoRz Ver Mensaje
y por último llamando primero a leerBD(2) y luego leerBD(1) a ver si en ésta ocasión te imprime en el div1 únicamente.
sólo me imprime en el div1, es decir se machaca lo del div 2

¿Ves el error?

Muchas gracias
  #10 (permalink)  
Antiguo 31/03/2011, 04:18
 
Fecha de Ingreso: enero-2007
Mensajes: 146
Antigüedad: 17 años, 9 meses
Puntos: 16
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

Pues parece que el error es que no puedes hacer dos peticiones tan seguidas. Prueba ahora a meter en un botón en el evento onclick por ejemplo el leerBD(2); a ver si primero carga automáticamente el 1 y luego al darle al 2 carga el 2 xD

Ahora mismo no sabría decirte si hay alguna forma de poner en "cola" sin "machacar" peticiones... a ver si alguien puede comentar su experiencia al respecto, de mientras voy a ver si encuentro algo.
  #11 (permalink)  
Antiguo 31/03/2011, 04:30
 
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

la primera solución que me propones creo que iría pero no es lo que busco, estoy pensando en traer todos los datos a lo burro en texto y descomponerlos, es que otra solución no se me ocurre.

Gracias de nuevo ;)
  #12 (permalink)  
Antiguo 31/03/2011, 04:48
 
Fecha de Ingreso: enero-2007
Mensajes: 146
Antigüedad: 17 años, 9 meses
Puntos: 16
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

No era una solución, era para comprobar lo que te comentaba jeje

He estado ojeando y el problema está en la sincronía/asincronía del Ajax. Por defecto las peticiones se hacen asíncronas, por lo que se van machacando unas a otras sin esperar a que termine, de ahí que únicamente se muestre la última.

Para solucionar el problema lo que hay que hacer son peticiones síncronas, lo cual se consigue modificando la siguiente línea:
Código Javascript:
Ver original
  1. http.open("POST", url, false);
(true por false)

Haciendo éste cambio podemos omitir la parte de comprobación de respuesta:
Código Javascript:
Ver original
  1. http.onreadystatechange = function() {//Call a function when the state changes.
  2.  
  3. if(http.readyState == 4 && http.status == 200) {
Ésto es debido a que el JS no se continuará ejecutando hasta que no haya respuesta de servidor, asi que evidentemente no necesitarías un callback a una función cuando recibas respuesta.
  #13 (permalink)  
Antiguo 04/04/2011, 04:33
 
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

Cita:
Iniciado por WeSoRz Ver Mensaje
No era una solución, era para comprobar lo que te comentaba jeje

He estado ojeando y el problema está en la sincronía/asincronía del Ajax. Por defecto las peticiones se hacen asíncronas, por lo que se van machacando unas a otras sin esperar a que termine, de ahí que únicamente se muestre la última.

Para solucionar el problema lo que hay que hacer son peticiones síncronas, lo cual se consigue modificando la siguiente línea:
Código Javascript:
Ver original
  1. http.open("POST", url, false);
(true por false)

Haciendo éste cambio podemos omitir la parte de comprobación de respuesta:
Código Javascript:
Ver original
  1. http.onreadystatechange = function() {//Call a function when the state changes.
  2.  
  3. if(http.readyState == 4 && http.status == 200) {
Ésto es debido a que el JS no se continuará ejecutando hasta que no haya respuesta de servidor, asi que evidentemente no necesitarías un callback a una función cuando recibas respuesta.
Muchas gracias por todo ;)
  #14 (permalink)  
Antiguo 04/04/2011, 05:51
 
Fecha de Ingreso: enero-2007
Mensajes: 146
Antigüedad: 17 años, 9 meses
Puntos: 16
Respuesta: Como no perder valor de parámetros pasados a funciones javascript

De nada, espero que te haya servido de ayuda :)

Etiquetas: funciones, perder
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 12:35.