Foros del Web » Programando para Internet » Javascript » Frameworks JS »

No hace split en parámetros

Estas en el tema de No hace split en parámetros en el foro de Frameworks JS en Foros del Web. Hola amigos. No logro dar con la solución. El caso es que uso ajax para enviar datos por POST y esos datos los leo de ...
  #1 (permalink)  
Antiguo 25/08/2010, 15:32
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Exclamación No hace split en parámetros

Hola amigos.

No logro dar con la solución. El caso es que uso ajax para enviar datos por POST y esos datos los leo de los campos de texto (input text y textarea) con identificadores.

El caso es que el código funciona bien con un parámetro. Si le intento pasar varios y hacer un split no lo logra. Os explico con código fuente:
Código HTML:
Ver original
  1. <textarea id="textoEscrito" rows="3" cols="87" onKeyPress="return capt(event);"></textarea>
  2. <input type="hidden" id="idConexion" value="1">

Esos son los dos campos que necesito enviar.
La función la lanzo así:
Código Javascript:
Ver original
  1. function capt(e){
  2.     var tcl = (document.all)?e.keyCode:e.which;
  3.     if (tcl==13){
  4.  
  5.         cargarContenidoPOST("pagina.php?accion=enviarMsg", "textoEscrito", "contenedorChat");
  6.        
  7.     }
  8. }

Y funciona de perlas con el segundo parámetro con valor "textoEscrito" que es el textarea.

Ahora el código fuente de la función ajax:
Código Javascript:
Ver original
  1. function cargarContenidoPOST(pagina, parametros, contenedor){
  2.  
  3.     contenedor = document.getElementById(contenedor);
  4.     envio = "";
  5.  
  6.         valor = document.getElementById(parametros).value;
  7.         envio += parametros+"="+valor+"&";
  8.  
  9.     ajax=nuevoAjax();
  10.     ajax.open('POST', pagina, true);
  11.     ajax.onreadystatechange=function() {
  12.    
  13.         if (ajax.readyState==4) {
  14.             contenedor.innerHTML = ajax.responseText
  15.         }
  16.  
  17.     }
  18.     ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  19.     ajax.send(envio);
  20. }

Y funciona de perlas.

Ahora viene el problema. Quiero enviar también el hidden con lo que hice esto:
Código Javascript:
Ver original
  1. function capt(e){
  2.     var tcl = (document.all)?e.keyCode:e.which;
  3.     if (tcl==13){
  4.  
  5.         cargarContenidoPOST("chat.php?accion=enviarMsg", "textoEscrito|idConexion", "contenedorChat");
  6.        
  7.     }
  8. }

Y modifico la función así:

Código Javascript:
Ver original
  1. function cargarContenidoPOST(pagina, parametros, contenedor){
  2.  
  3.     contenedor = document.getElementById(contenedor);
  4.     envio = "";
  5.     parametros.split("|");
  6.  
  7.     for(i in parametros) {
  8.  
  9.         valor = document.getElementById(parametros[i]).value;
  10.         envio += parametros[i]+"="+valor+"&";
  11.    
  12.     }
  13.  
  14.     ajax=nuevoAjax();
  15.     ajax.open('POST', pagina, true);
  16.     ajax.onreadystatechange=function() {
  17.    
  18.         if (ajax.readyState==4) {
  19.             contenedor.innerHTML = ajax.responseText
  20.         }
  21.  
  22.     }
  23.     ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  24.     ajax.send(envio);
  25. }

Y no va, no funciona! La consola de errores de firefox me dice que document.getElementById(parametros[i]) es nulo. ¿Cómo si funciona de uno, no funciona de dos?

Es un tema que me tiene muy mosca. Haciendo debug después de hacer split() a parametros me crea el array perfectamente.

Y otra cosa, que probé a cambiar el for(i in parametros) por for(i=0; i<parametros.length; i++) y tampoco va!

agradezco cualquier ayuda.

Desde ya, muchas gracias!
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #2 (permalink)  
Antiguo 25/08/2010, 15:52
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: No hace split en parámetros

Creo que más bien es un problema de javascript. Por favor, si hiciesen el favor de mover el mensaje se lo agradecería y disculpen las molestia.s
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #3 (permalink)  
Antiguo 25/08/2010, 16:33
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 10 meses
Puntos: 126
Respuesta: No hace split en parámetros

Hola

Prueba con una variable param = parametros.split("|");

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #4 (permalink)  
Antiguo 25/08/2010, 16:46
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: No hace split en parámetros

Hace lo mismo sin explicación. Ambos elementos existen...
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #5 (permalink)  
Antiguo 26/08/2010, 12:22
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 10 meses
Puntos: 126
Respuesta: No hace split en parámetros

Hola

No lo entiendo. En una desesperada, si esos son los dos únicos campos del formulario, puedes hacer esto
La llamada a capt. Antes dale un name (el mismo que la id) a los campos
Cita:
onKeyPress="return capt(event, this.form);
En capt
Cita:
function capt(e, val){
var tcl = (document.all)?e.keyCode:e.which;
if (tcl==13){

cargarContenidoPOST("pagina.php?accion=enviarMsg", val[0].value, val[1].value, "contenedorChat");

}
}
En cargarContenidoPOST
Cita:
function cargarContenidoPOST(pagina, parametros1, parametros2, contenedor){

contenedor = document.getElementById(contenedor);


ajax=nuevoAjax();
ajax.open('POST', pagina, true);
ajax.onreadystatechange=function() {

if (ajax.readyState==4) {
contenedor.innerHTML = ajax.responseText
}

}
ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
ajax.send('textoEscrito='+parametros1+'&idConexion ='+parametros2);
}
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #6 (permalink)  
Antiguo 26/08/2010, 15:11
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: No hace split en parámetros

Pero eso me obliga a usar esa función para ese formulario únicamente.
Mi idea era utilizar esa función para múltiples propósitos, y no hacer una función exactamente igual una y otra, y otra vez para otras cosas.

No entiendo lo que pasa, lo he probado de varias formas distintas, pero se jode al intentar enviar más de un parámetro.

¿Alguna idea de cómo rehacer la función con el mismo propósito?

Saludos.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #7 (permalink)  
Antiguo 26/08/2010, 15:15
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: No hace split en parámetros

Si tú copiases el código fuente de arriba que puse yo te funcionaría?
Podrías probarlo por favor?
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #8 (permalink)  
Antiguo 26/08/2010, 16:23
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 10 meses
Puntos: 126
Respuesta: No hace split en parámetros

Hola

Si es como te dije en un principio. Fijate el único cambio que hecho, aparte de join(). Usa join() para evitar que se escriba una "&" al final
Código Javascript:
Ver original
  1. function capt(e){
  2.     var tcl = (document.all)?e.keyCode:e.which;
  3.     if (tcl==13){
  4.  
  5.         cargarContenidoPOST("chat.php?accion=enviarMsg", "textoEscrito|idConexion", "contenedorChat");
  6.        
  7.     }
  8. }
  9.  
  10. function cargarContenidoPOST(pagina, parametros, contenedor){
  11.  
  12.     contenedor = document.getElementById(contenedor);
  13.     envio = [];
  14.     param = parametros.split("|");
  15.  
  16.  for(i in param) {
  17.  
  18.         valor = document.getElementById(param[i]).value;
  19.         envio[i] = param[i]+"="+valor;
  20.    
  21.     }
  22.  
  23.     ajax=nuevoAjax();
  24.     ajax.open('POST', pagina, true);
  25.     ajax.onreadystatechange=function() {
  26.    
  27.         if (ajax.readyState==4) {
  28.             contenedor.innerHTML = ajax.responseText
  29.         }
  30.  
  31.     }
  32.     ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  33.     ajax.send(envio.join('&'));
  34. }
  35.    
  36. }
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #9 (permalink)  
Antiguo 27/08/2010, 10:25
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: No hace split en parámetros

Nada, el problema seguía siendo el mismo, no existe el elemento, la línea:
Código Javascript:
Ver original
  1. valor = document.getElementById(param[i]).value;

Así que se me ocurrió meterle una cadena antes del texto del id y quedó así:

Código Javascript:
Ver original
  1. valor = document.getElementById("campo"+param[i]).value;
Código HTML:
Ver original
  1. <input type="hidden" id="campoidConexion" value="x">


Voilà , funcionó al momento, no me preguntes porqué, necesita un texto antes de la variable.

Saludos y mil gracias!

PD: ¿Tiene esto alguna explicación lógica?
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #10 (permalink)  
Antiguo 27/08/2010, 13:30
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 10 meses
Puntos: 126
Respuesta: No hace split en parámetros

Hola

Pues no, el código que te presenté está probado y funciona. Lo dejaremos con un expediente X

Enhorabuena
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #11 (permalink)  
Antiguo 27/08/2010, 19:16
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: No hace split en parámetros

confio que el codigo de adler funciona correctamente, aparte de que lo analice mentalmente. sin embargo, no encuentro la explicacion logica del por que soluciono agregando un string antes del id. como ultimo recurso se me ocurre analizar como el navegador esta enviando la peticion http y como el servidor lo esta recibiendo. para el analisis del envio puedes usar el addons httpfox de firefox.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #12 (permalink)  
Antiguo 27/08/2010, 19:42
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: No hace split en parámetros

Yo tampoco lo entiendo. No llegaba a enviar petición http alguna porque ni siquiera era un problema de ajax (me equivoqué de foro al postear), era de javascript. El script se cortaba en el momento de agarrar el valor del input.
getElementById(parametro) es correcto
getElementById("string"+parametro) es correcto
getElementById("string"+parametro[i]) es correcto

getElementById(parametro[i]) es incorrecto

Para mi no tiene sentido, y el código fue probado en Firefox 3.6.8, Firefox 4.0 Beta 4, Opera, Google Chromium, Google Chrome, IE4Linux, Konqueror, reKonq y Midori (en Linux) y Firefox 3.6.10, firefox 4.0 beta 4, IE 6, IE 7, IE 8 (virtualbox con windows xp) y en todos el mismo error.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #13 (permalink)  
Antiguo 27/08/2010, 20:12
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: No hace split en parámetros

el que marcas como incorrecto deberia funcionarte igual. capaz que algo hicistes mal. ¿cual es el error, si alguno, que te indica la consola? el siguiente ejemplo es solo una demostracion de que la sintaxis funciona correctamente. aqui utilizo alert pero solo para mostrar el valor.
Código:
var s = "foo|bar|zoo".split("|");
for(var i in s)alert(s[i]);
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #14 (permalink)  
Antiguo 27/08/2010, 20:17
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: No hace split en parámetros

Que si, que ya lo se. Debería funcionar porque no es incorrecto, es totalmente correcto. El que dice que es incorrecto es la consola de errores de firefox.
document.getElementById(parametro[i]) is null
Con un string delante o detrás ya no es nulo. Por tanto, es cien por cien pajarada.

No da ni un solo problema cuando es un parámetro, no da problemas cuando son varios parámetros pero con un string en el getElementById, pero sí da problemas cuando son varios parámetros y no llevan más que su propio valor.

Raro raro raro.

Saludos.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #15 (permalink)  
Antiguo 27/08/2010, 20:33
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: No hace split en parámetros

no se pues, en mi experiencia la unica forma que getElementById devuelve null es si: (a) el elemento con dicho ID no existe en el documento, (b) si escribes mal el id. ¿no habra sido este ultimo?
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #16 (permalink)  
Antiguo 28/08/2010, 02:04
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: No hace split en parámetros

Cita:
Iniciado por zerokilled Ver Mensaje
no se pues, en mi experiencia la unica forma que getElementById devuelve null es si: (a) el elemento con dicho ID no existe en el documento, (b) si escribes mal el id. ¿no habra sido este ultimo?
Gracias por interesarte zerokilled, pero lo único que había mal escrito era que no tenía algo antes (o después) del id. Lo solucioné poniendo una "c" delante sin más, y acabé poniéndole "campo" para identificarlos mejor.
Como dato curioso, si pongo "campo-"+parametro[i] tampoco funciona (nótese el guión antes de las comillas).

Saludos!
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #17 (permalink)  
Antiguo 28/08/2010, 07:22
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 10 meses
Puntos: 126
Respuesta: No hace split en parámetros

Cita:
Iniciado por CHuLoSoY Ver Mensaje
Como dato curioso, si pongo "campo-"+parametro[i] tampoco funciona (nótese el guión antes de las comillas).
Sí, esto que mencionas también me ocurrió, y aún no he entendido el por qué. El caso que dejé de usar el guión alto y lo cambié por el guión bajo. Enigmas de la programación
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />

Etiquetas: ajax, split
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 18:37.