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

¿Cómo enviar un array mediante ajax?

Estas en el tema de ¿Cómo enviar un array mediante ajax? en el foro de Frameworks JS en Foros del Web. Hola foreros, tengo una duda. Estoy realizando una consulta a mi BD de la cual obtengo cadenas, que son en sí, las rutas de direcciones ...
  #1 (permalink)  
Antiguo 03/06/2010, 16:20
Avatar de JavierMMM  
Fecha de Ingreso: agosto-2008
Ubicación: Justito frente a la computadora.
Mensajes: 278
Antigüedad: 16 años, 2 meses
Puntos: 0
Pregunta ¿Cómo enviar un array mediante ajax?

Hola foreros, tengo una duda.

Estoy realizando una consulta a mi BD de la cual obtengo cadenas, que son en sí, las rutas de direcciones físicas en mi server. Son cerca de 10 mil cadenas diferentes, ya que cada una es la ruta de un archivo diferente.

Lo que necesito hacer es, enviar este vector mediante ajax, de mi página archivo.asp a proceso.asp. Ya puedo enviar una sola variable, pero necesito enviar el array, y lo trato de hacer de esta manera:
Código HTML:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Prueba Ajax</title>
<%
<script language="javascript" type="text/javascript">`
function handleHttpResponse() 
{
    if (http.readyState == 4) 
	{
       if (http.status == 200) 
	   {
          if (http.responseText.indexOf('invalid') == -1) 
		  {
             // Armamos un array, usando la coma para separar elementos
             results = http.responseText.split(",");
             document.getElementById("campoMensaje").innerHTML = results[0];
             enProceso = false;
          }
       }
    }
}

function verificaUsuario() 
{
    if (!enProceso && http) 
	{
       var valor = escape(document.getElementById("arreg(i)").value);
       var url = "proceso.asp?arreg(i)="+ valor;
       http.open("GET", url, true);
       http.onreadystatechange = handleHttpResponse;
       enProceso = true;
       http.send(null);
    }
}

function getHTTPObject() 
{
    var xmlhttp;
    /*@cc_on
    @if (@_jscript_version >= 5)
       try {
          xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
          try {
             xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (E) { xmlhttp = false; }
       }
    @else
    xmlhttp = false;
    @end @*/
    if (!xmlhttp && typeof XMLHttpRequest != 'undefined') 
	{
       try 
	   {
          xmlhttp = new XMLHttpRequest();
       } 
	   catch (e) { xmlhttp = false; }
    }
    return xmlhttp;
}

var enProceso = false; // lo usamos para ver si hay un proceso activo
var http = getHTTPObject(); // Creamos el objeto XMLHttpRequest

</script>

Ors.open "SELECT TOP 10 A.Id, A.Archivo FROM C_MATERIAL A LEFT JOIN C_CURSOS B ON (A.id = B.id) WHERE (YEAR(A.fechainicio) >= 2009) AND A.Id NOT IN (Select Id_Archivo From X_Respaldo) GROUP BY A.Id, Archivo ORDER BY Archivo", Conn 
	Do While not Ors.eof
		nombre_carpeta = Ors("Archivo")
                
                Redim arreg(10000)
		
		for i=0 to Ors.eof
			arreg(i) = nombre_carpeta
		Next 
		%>
		<form method="post" >
			<input type="hidden" name="arreg(i)" id="arreg(i)" value="<%=arreg(i)%>" >
		</form>
		<div id="campoMensaje"></div>
		<%
		Ors.movenext
	Loop
	Ors.Close
	set fs=nothing

%>

</body>
</html>

<SCRIPT>
verificaUsuario();
</SCRIPT> 
y en mi página de proceso la recibo de esta manera:
Código HTML:
nombre_carpeta = request.querystring("nombre_carpeta")
y ya sigo con un proceso de la cadena.... pero con el array, a pesar de que no marca error, no hace nada.

¿Alguién sabe cómo puedo hacerle para que mande el array?

Gracias de antemano
  #2 (permalink)  
Antiguo 05/06/2010, 04:57
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 10 meses
Puntos: 126
Respuesta: ¿Cómo enviar un array mediante ajax?

Hola

No entiendo por que redimensionas el array a 10000
Redim arreg(10000)
cuando solomente traes 10 registros de tu consulta
SELECT TOP 10

Cambia a esto
Cita:
<input type="hidden" name="arreg[]" id="arreg[]" value="<%=arreg(i)%>" >
En esta función

Cita:
function verificaUsuario()
{
if (!enProceso && http)
{
elemento = 'arreg[]';
frm = document.formulario;
valor = new Array();
for (var i = 0, total = frm[elemento]; i < total; i++) {
valor[valor.length] = escape(frm[elemento][i].value);
}



var url = "proceso.asp?nombre_carpeta="+ valor.join(",");
http.open("GET", url, true);
http.onreadystatechange = handleHttpResponse;
enProceso = true;
http.send(null);
}
}

Saca el form del while y dale un nombre

Cita:
<form name="formulario">
<%
Ors.open "SELECT TOP 10 A.Id, A.Archivo FROM C_MATERIAL A LEFT JOIN C_CURSOS B ON (A.id = B.id) WHERE (YEAR(A.fechainicio) >= 2009) AND A.Id NOT IN (Select Id_Archivo From X_Respaldo) GROUP BY A.Id, Archivo ORDER BY Archivo", Conn
Do While not Ors.eof
.......

Loop
Ors.Close
set fs=nothing
%>
</form>
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;" />
  #3 (permalink)  
Antiguo 05/06/2010, 13:25
Avatar de JavierMMM  
Fecha de Ingreso: agosto-2008
Ubicación: Justito frente a la computadora.
Mensajes: 278
Antigüedad: 16 años, 2 meses
Puntos: 0
De acuerdo Respuesta: ¿Cómo enviar un array mediante ajax?

Gracias Adler por contestar... Redimensiono a 10,000, porque mi consulta completa me trae 10,061 cadenas, en esta primera etapa (la de prueba)....

Y por lo otro, ya trabajo en ello... probaré tu código y luego te comento lo que sucedió.

Nuevamente, gracias
  #4 (permalink)  
Antiguo 07/06/2010, 15:42
Avatar de JavierMMM  
Fecha de Ingreso: agosto-2008
Ubicación: Justito frente a la computadora.
Mensajes: 278
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: ¿Cómo enviar un array mediante ajax?

Ya probé el código que me compartiste Adler, pero no sucede nada. Hasta ahora no me envía el vector a la página de proceso....
  #5 (permalink)  
Antiguo 07/06/2010, 17:26
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 7 meses
Puntos: 1284
Respuesta: ¿Cómo enviar un array mediante ajax?

Hola:

Si no usas técnicas distintas a las normales de procesamiento de variables por url, debes poner todos los elementos del array en la lista de datos a enviar... No tengo claro como se procesan los datos en asp, pero si el dato tiene nombre dato, para dos valores ( 1 y 2 por ejemplo), debes generar una url del tipo "?dato=1&dato=2", por ejemplo, si se tratase de php la línea sería: "?dato[]=1&dato[]=2"... con los corchetes php procesaría un array... en asp supongo que lo sabrás.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #6 (permalink)  
Antiguo 08/06/2010, 04:48
 
Fecha de Ingreso: junio-2010
Mensajes: 76
Antigüedad: 14 años, 5 meses
Puntos: 2
Respuesta: ¿Cómo enviar un array mediante ajax?

Hola a todos, yo la verdad es que no se nada de asp pero viendo la primera parte de tu post te puedo decir que envies todos los resultados de la consulta a una variable string separados por la coma como pusiste tu, se lo pasas a AJAX con el responsetext y lo trates en el html mediante javascript con las propiedades de substring e indexof, como cada elemento va separado por comas (puedes usar otro separador evidentemente) pues vas 'cortando' la variable.
Con indexof buscas el caracter ',' que te devuelve la posicion en el string de la primera concordancia y con substring cortas el string desde ese numero + 2 caracteres para quitar la coma hasta el final. No se si me he explicado bien. Claro que este metodo lo hice para una consulta de 9 resultados, lo que no es nada comparado con la tuya (sin embargo puedes hacer varias consultas repitiendo este metodo)
  #7 (permalink)  
Antiguo 08/06/2010, 05:55
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 10 meses
Puntos: 126
Respuesta: ¿Cómo enviar un array mediante ajax?

Hola

Una pequeña modificación a esta línea

Cita:
for (var i = 0, total = frm[elemento].length; i < total; i++)
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;" />
  #8 (permalink)  
Antiguo 08/06/2010, 16:36
Avatar de JavierMMM  
Fecha de Ingreso: agosto-2008
Ubicación: Justito frente a la computadora.
Mensajes: 278
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: ¿Cómo enviar un array mediante ajax?


No funciona

este es el codigo que tengo en principal.asp

Código:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Prueba Ajax</title>

<script language="javascript" type="text/javascript">
function handleHttpResponse() {
    if (http.readyState == 4) {
       if (http.status == 200) {
          if (http.responseText.indexOf('invalid') == -1) {
             // Armamos un array, usando la coma para separar elementos
             results = http.responseText.split(",");
             document.getElementById("campoMensaje").innerHTML = results[0];
             enProceso = false;
          }
       }
    }
}

function verificaUsuario() 
{
    if (!enProceso && http) 
	{
		elemento = 'arreg[]';
		frm = document.formulario;
		valor = new Array();
		for (var i = 0, total = frm[elemento].length; i < total; i++)
		{
			valor[valor.length] = escape(frm[elemento][i].value);
		}
		
		var url = "consulta.asp?nombre_carpeta="+ valor.join(",");
		http.open("GET", url, true);
		http.onreadystatechange = handleHttpResponse;
		enProceso = true;
		http.send(null);
	}
}

function getHTTPObject() {
    var xmlhttp;
    /*@cc_on
    @if (@_jscript_version >= 5)
       try {
          xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
          try {
             xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (E) { xmlhttp = false; }
       }
    @else
    xmlhttp = false;
    @end @*/
    if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
       try {
          xmlhttp = new XMLHttpRequest();
       } catch (e) { xmlhttp = false; }
    }
    return xmlhttp;
}

var enProceso = false; // lo usamos para ver si hay un proceso activo
var http = getHTTPObject(); // Creamos el objeto XMLHttpRequest

</script>
</head>

<body>
<%
  	Set Conn = Server.CreateObject("ADODB.Connection")
	Set Ors = Server.CreateObject("ADODB.Recordset")
	Conn.open = "conexion"
	Ors.open "SELECT TOP 1 A.Id, A.Archivo FROM C_MATERIAL A LEFT JOIN C_CURSOS B ON (A.id = B.id) WHERE (YEAR(A.fechainicio) >= 2009) AND A.Id NOT IN (Select Id_Archivo From X_Respaldo) GROUP BY A.Id, Archivo ORDER BY Archivo", Conn
%><form action="post" name="formulario"><%
	Do While not Ors.eof
		nombre_carpeta = Ors("Archivo")
        Redim arreg(10000)
		for i=0 to Ors.eof
			arreg(i) = nombre_carpeta
		Next
		%>
        <input type="hidden" name="arreg[]" id="arreg[]" value="<%=arreg(i)%>">
        <!--<INPUT type="Button" value="Verificar si existe" onclick="verificaUsuario();">-->
		<%
		Ors.movenext
	Loop
	Ors.Close
	set fs=nothing

%>
</form>
<div id="campoMensaje"></div>
</body>
</html>
y esto en consulta.asp

Código:
<%
' me fijo si viene algun valor en el querystring, si no viene nada, no hago nada
if request.querystring("nombre_carpeta") <> "" then
   	nombre_carpeta = request.querystring("nombre_carpeta") & "<br />"
	response.Write(nombre_carpeta) & "<br />"
else
	response.Write("error")
end if
%>
Al final me regresa ¨error¨.... al parecer no esoy enviando nada....


Pregunta ante una duda que me surge... en la página de consulta, ¿debo de dejarla de esa manera, o hay alguna manera especial de recibir el vector [que supongo que así debe de ser]?

Última edición por JavierMMM; 08/06/2010 a las 17:45
  #9 (permalink)  
Antiguo 09/06/2010, 05:02
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 7 meses
Puntos: 1284
Respuesta: ¿Cómo enviar un array mediante ajax?

Hola:

Deberías poner para la parte del navegador/cliente lo que tiene la página (ver código fuente)... otra cosa, si vas a poner algo con corchetes, indicando que es un array, el servidor trabajará la variable como un array (por lo menos con el índice 0, o poner el array como te he explicado antes)

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #10 (permalink)  
Antiguo 09/06/2010, 05:11
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 10 meses
Puntos: 126
Respuesta: ¿Cómo enviar un array mediante ajax?

Hola

Si que funciona. El problema lo tienes en el ASP.

Revisa en el Firebug esté ejemplo que está basado en lo que te ocupa, verás como se envía

Código Javascript:
Ver original
  1. <&#37;@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>Prueba Ajax</title>
  7.  
  8. <script language="javascript" type="text/javascript">
  9. function handleHttpResponse() {
  10.     if (http.readyState == 4) {
  11.        if (http.status == 200) {
  12.           if (http.responseText.indexOf('invalid') == -1) {
  13.              // Armamos un array, usando la coma para separar elementos
  14.              results = http.responseText.split(",");
  15.              document.getElementById("campoMensaje").innerHTML = results[0];
  16.              enProceso = false;
  17.           }
  18.        }
  19.     }
  20. }
  21.  
  22. function verificaUsuario()
  23. {
  24.     if (!enProceso && http)
  25.     {
  26.         elemento = 'arreg[]';
  27.         frm = document.formulario;
  28.         valor = new Array();
  29.         for (var i = 0, total = frm[elemento].length; i < total; i++)
  30.         {
  31.             valor[valor.length] = escape(frm[elemento][i].value);
  32.         }
  33.        
  34.         var url = "consulta.asp?nombre_carpeta="+ valor.join(",");
  35.         http.open("GET", url, true);
  36.         http.onreadystatechange = handleHttpResponse;
  37.         enProceso = true;
  38.         http.send(null);
  39.     }
  40. }
  41.  
  42. function getHTTPObject() {
  43.     var xmlhttp;
  44.     /*@cc_on
  45.     @if (@_jscript_version >= 5)
  46.        try {
  47.           xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  48.        } catch (e) {
  49.           try {
  50.              xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  51.           } catch (E) { xmlhttp = false; }
  52.        }
  53.     @else
  54.     xmlhttp = false;
  55.     @end @*/
  56.     if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
  57.        try {
  58.           xmlhttp = new XMLHttpRequest();
  59.        } catch (e) { xmlhttp = false; }
  60.     }
  61.     return xmlhttp;
  62. }
  63.  
  64. var enProceso = false; // lo usamos para ver si hay un proceso activo
  65. var http = getHTTPObject(); // Creamos el objeto XMLHttpRequest
  66.  
  67. </script>
  68. </head>
  69.  
  70. <body>
  71. <form action="post" name="formulario">
  72.  
  73.         <input type="text" name="arreg[]" id="arreg[]" value="1"><br />
  74.   <input type="text" name="arreg[]" id="arreg[]" value="2"><br />
  75.   <input type="text" name="arreg[]" id="arreg[]" value="3"><br />
  76.   <input type="text" name="arreg[]" id="arreg[]" value="4"><br />
  77.   <input type="text" name="arreg[]" id="arreg[]" value="5"><br />
  78.   <input type="text" name="arreg[]" id="arreg[]" value="6"><br />
  79.         <INPUT type="Button" value="Verificar si existe" onclick="verificaUsuario();">
  80.        
  81. </form>
  82. <div id="campoMensaje"></div>
  83. </body>
  84. </html>

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;" />

Etiquetas: ajax, enviar
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 23:53.