Foros del Web » Programando para Internet » Javascript »

xmlhttpRequest con addEventListener y múltiples argumentos

Estas en el tema de xmlhttpRequest con addEventListener y múltiples argumentos en el foro de Javascript en Foros del Web. buenos días, Pretendo hacer una llamada ajax por cada archivo subido, y disponer de un div donde mostrar el proceso de subida archivo a archivo, ...
  #1 (permalink)  
Antiguo 19/09/2014, 04:40
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
xmlhttpRequest con addEventListener y múltiples argumentos

buenos días,

Pretendo hacer una llamada ajax por cada archivo subido, y disponer de un div donde mostrar el proceso de subida archivo a archivo, me encuentro con el problema de poder pasar varios argumentos para manejar el evento, no tengo claro como pasar varios argumentos a la función progreso:

Código Javascript:
Ver original
  1. function subirArchivo() {
  2.    
  3.             var archivos = document.getElementById("files").files;
  4.    
  5.             for(var i = 0; i< archivos.length; i++)
  6.             {
  7.                 var file = archivos[i];
  8.                 var formdata = new FormData();
  9.                 formdata.append("upload", file);
  10.        
  11.                 var ajax = new XMLHttpRequest();
  12.                     ajax.upload.addEventListener("progress", progreso, false);
  13.                     ajax.addEventListener("load", operacion_completada, false);
  14.                     ajax.addEventListener("error", mensaje_error, false);
  15.                     ajax.addEventListener("abort", abortar_subida, false);
  16.                     ajax.open("POST", "upload.php");
  17.                     ajax.send(formdata);
  18.             }
  19.         }
  20.  
  21.  
  22.         function progreso(event){
  23.    
  24.             document.getElementById("total").innerHTML = "Subidos "+ event.loaded+" bytes de "+event.total;
  25.             var percent = (event.loaded / event.total) * 100;
  26.             document.getElementById("progressBar").value = Math.round(percent);
  27.             document.getElementById("estado").innerHTML = Math.round(percent)+"% subiendo... por favor, espere";
  28.         }
  29.  
  30.         function operacion_completada(event) {
  31.  
  32.             document.getElementById("estado").innerHTML = event.target.responseText;
  33.             document.getElementById("progressBar").value = 0;
  34.         }
  35.  
  36.         function mensaje_error(event) {
  37.  
  38.             document.getElementById("estado").innerHTML = "Error al subir el archivo";
  39.         }
  40.  
  41.         function abortar_subida(event) {
  42.        
  43.             document.getElementById("estado").innerHTML = "Upload Abort";
  44.         }
  #2 (permalink)  
Antiguo 19/09/2014, 04:50
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 9 meses
Puntos: 1012
Respuesta: xmlhttpRequest con addEventListener y múltiples argumentos

has de usar una función anónima. como verás. en este caso le paso el objeto event
Cita:
ajax.upload.addEventListener("progress", function(event){progreso(event, param1, param2)}, false);
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #3 (permalink)  
Antiguo 22/09/2014, 05:35
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: xmlhttpRequest con addEventListener y múltiples argumentos

buenos días,

He hecho algunos cambios, para crear un div por cada archivo subido, pero cuando subo múltiples archivos, aunque se crean los div correspondientes, es decir, un div por cada archivo, sin embargo solo se actualiza el último.

Es decir, si quiero subir 3 archivos a la vez, se crean estado, avance y textor para los tres (estado1, avance1 y textor1 ... estado2, avance2 y textor2 ... estado3, avance3 y textor3) pero las actualizaciones del progreso se reflejan en el tercer div (estado3, avance3 y textor3)

Código Javascript:
Ver original
  1. var nuar = 0;
  2.        
  3.         function subirArchivo() {
  4.    
  5.             var archivos = document.getElementById("files").files;
  6.    
  7.             for(var i = 0; i< archivos.length; i++)
  8.             {
  9.                 var file = archivos[i];
  10.                 var formdata = new FormData();
  11.                 formdata.append("upload", file);
  12.                
  13.                 nuar += 1;
  14.                 nuel = "estado" + nuar;
  15.                 nuav = "avance" + nuar;
  16.                 nure = "textor" + nuar;
  17.  
  18.                 cael = document.createElement("div");
  19.                 cael.setAttribute("id", nuel);
  20.                 document.getElementById("estado").appendChild(cael);
  21.                
  22.                 caav = document.createElement("div");
  23.                 caav.setAttribute("id", nuav);
  24.                 document.getElementById(nuel).appendChild(caav);
  25.        
  26.                 care = document.createElement("div");
  27.                 care.setAttribute("id", nure);
  28.                 document.getElementById(nuel).appendChild(care);
  29.  
  30.                 var ajax = new XMLHttpRequest();
  31.                     //ajax.upload.addEventListener("progress", progreso, false);
  32.                     ajax.upload.addEventListener("progress", function(event){progreso(event, nuar)}, false);
  33.                     ajax.addEventListener("load", function(event){operacion_completada(event,nuar)}, false);
  34.                     ajax.addEventListener("error", mensaje_error, false);
  35.                     ajax.addEventListener("abort", abortar_subida, false);
  36.                     ajax.open("POST", "upload.php");
  37.                     ajax.send(formdata);
  38.             }
  39.         }
  40.  
  41.  
  42.         function progreso(event,nuar){
  43.    
  44.             nuesav = "avance" + nuar;
  45.             document.getElementById("total").innerHTML = "Subidos "+ event.loaded+" bytes de "+event.total;
  46.             var percent = (event.loaded / event.total) * 100;
  47.             document.getElementById("progressBar").value = Math.round(percent);
  48.             document.getElementById(nuesav).innerHTML = Math.round(percent)+"% subiendo... por favor, espere";
  49.         }
  50.  
  51.         function operacion_completada(event,nuar) {
  52.  
  53.             nuesre = "textor" + nuar;
  54.             document.getElementById(nuesre).innerHTML = event.target.responseText;
  55.             document.getElementById("progressBar").value = 0;
  56.         }
  57.  
  58.         function mensaje_error(event) {
  59.  
  60.             document.getElementById("estado").innerHTML = "Error al subir el archivo";
  61.         }
  62.  
  63.         function abortar_subida(event) {
  64.        
  65.             document.getElementById("estado").innerHTML = "Upload Abort";
  66.         }
  #4 (permalink)  
Antiguo 22/09/2014, 06:26
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 9 meses
Puntos: 1012
Respuesta: xmlhttpRequest con addEventListener y múltiples argumentos

prueba con función anónima para pasarle a la función anónima la variable i
Cita:
for(var i = 0; i< archivos.length; i++) {
(function(i) {
........
}(i);
}
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #5 (permalink)  
Antiguo 22/09/2014, 08:43
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: xmlhttpRequest con addEventListener y múltiples argumentos

Buenas tardes,

Esta solución que propones lo la entiendo bien, no veo como sería el código completo.

sin embargo, tal y como está construido no puedo crear los div siguiendo el valor de i, por que si se suben 3 archivos, y luego se eligen 3 más para subir, los dív para los 3 últimos archivos no serían 4, 5 y 6.
  #6 (permalink)  
Antiguo 22/09/2014, 16:14
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 9 meses
Puntos: 1012
Respuesta: xmlhttpRequest con addEventListener y múltiples argumentos

Cita:
Iniciado por evoarte Ver Mensaje
Esta solución que propones lo la entiendo bien, no veo como sería el código completo.
no sé qué es lo que no entiendes
Cita:
Iniciado por evoarte Ver Mensaje
sin embargo, tal y como está construido no puedo crear los div siguiendo el valor de i, por que si se suben 3 archivos, y luego se eligen 3 más para subir, los dív para los 3 últimos archivos no serían 4, 5 y 6.
no, tal y como planteas hacerlo, es como no puedes lograr tu propósito. cuando se subieran otros 3 archivos, el largo de var archivos sería 6 y var nuar valdría 9 (3 de la primera subida y 6 de la segunda). una solución es esta
Código:
var nuar = 0;
var cuantos = 0;

           function subirArchivo() {
    
                 var archivos = document.getElementById("files").files;
	         var i;

                 for(i = cuantos; i< archivos.length; i++)
	         {

                 }

                 cuantos = i;

           }
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #7 (permalink)  
Antiguo 24/09/2014, 04:50
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: xmlhttpRequest con addEventListener y múltiples argumentos

Hola Isabel,

Los contadores los tengo bien, creo que el problema es otro,

En el caso de que seleccione 2 archivos:
lo que he observado es que hasta que no termina el bucle for no se dispara el evento, por que cuando sube el primer archivo no se muestra ni el proceso de subida ni el resultado de esa primera llamada ajax,
si embargo, al enviar el segundo si.

Cuando voy seleccionando 1 a 1 no hay problema.

un saludo,
josé carlos.

Última edición por evoarte; 24/09/2014 a las 05:30
  #8 (permalink)  
Antiguo 24/09/2014, 16:16
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 9 meses
Puntos: 1012
Respuesta: xmlhttpRequest con addEventListener y múltiples argumentos

no veo el objeto de preguntar si no tomas en cuenta nada de lo que se te dice. y peor aún, no veo sentido a intentar ayudate. de tal modo que esta será mi última intervención en este tema

haré algo que tu no has hecho, probar para ver si funciona
Cita:
var nuar = 0;

function subirArchivo() {
var archivos = 3;
for(var i = 0; i< archivos; i++){
nuar += 1;
document.querySelectorAll('.p')[i].addEventListener('click', function(event){progreso(event, nuar)}, false);
}
}

function progreso(event,nuar){
console.log(nuar); // valores 3,3,3
}


window.addEventListener('load', subirArchivo, false);
Cita:
function subirArchivo() {
var archivos = 3;
for(var i = 0; i< archivos; i++){
(function(i) {
document.querySelectorAll('.p')[i].addEventListener('click', function(event){progreso(event, i)}, false);
})(i)
}
}

function progreso(event,nuar){
console.log(nuar); // valores 0,1,2
}


window.addEventListener('load', subirArchivo, false);
te lo doy mascado

Cita:
<span class="p" style="margin-right: 30px; width:100px; height:100px">1</span>
<span class="p" style="margin-right: 30px; width:100px; height:100px">2</span>
<span class="p" style="margin-right: 30px; width:100px; height:100px">3</span>
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #9 (permalink)  
Antiguo 24/09/2014, 16:52
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: xmlhttpRequest con addEventListener y múltiples argumentos

hola Isabel,

la primera solución no la entendía, por eso no la había utilizado, he leído sobre funciones anónimas y empiezo a ver algo de luz, mañana realizo las pruebas y te comento.

la segunda, si la he probado, pero no he podido hacerla funcionar.

Mañana veo y te digo.

salu2.
  #10 (permalink)  
Antiguo 25/09/2014, 05:53
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: xmlhttpRequest con addEventListener y múltiples argumentos

Hola Isabel,

Casi ...
Si subo varios archivos a la vez esta solución funciona,
pero si vuelvo a subir, sin recargar la página, ya no funciona.

así está el código:
Código Javascript:
Ver original
  1. var nuar = 0;
  2.        
  3.         function subirArchivo() {
  4.    
  5.             var archivos = document.getElementById("files").files;
  6.  
  7.             for(i=0; i<archivos.length; i++)
  8.             {
  9.                 (function(i){
  10.  
  11.                     var file = archivos[i];
  12.                     var formdata = new FormData();
  13.                     formdata.append("upload", file);
  14.                
  15.                     nuel = "estado" + i;
  16.                     nuav = "avance" + i;
  17.                     nure = "textor" + i;
  18.                     nuno = "nofile" + i;
  19.                     nuda = "capaba" + i;
  20.                     nuba = "nbarra" + i;
  21.                     noar = document.getElementById("files").files[i].name;             
  22.  
  23.                     cael = document.createElement("div");
  24.                     cael.setAttribute("id", nuel);
  25.                     document.getElementById("estado").appendChild(cael);
  26.                    
  27.                     caar = document.createElement("div");
  28.                     caar.setAttribute("id", nuno);
  29.                     document.getElementById(nuel).appendChild(caar);
  30.                     document.getElementById(nuno).innerHTML = i + " " + noar;
  31.                
  32.                     caav = document.createElement("div");
  33.                     caav.setAttribute("id", nuav);
  34.                     document.getElementById(nuel).appendChild(caav);
  35.                
  36.                     cada = document.createElement("div");
  37.                     cada.setAttribute("id", nuda);
  38.                     cada.setAttribute('class','progressbar');
  39.                     document.getElementById(nuel).appendChild(cada);
  40.                     caba = document.createElement("div");
  41.                     caba.setAttribute("id", nuba);
  42.                     caba.setAttribute('class','progress');
  43.                     document.getElementById(nuda).appendChild(caba);
  44.        
  45.                     care = document.createElement("div");
  46.                     care.setAttribute("id", nure);
  47.                     document.getElementById(nuel).appendChild(care);
  48.  
  49.                     var ajax = new XMLHttpRequest();
  50.                         //ajax.upload.addEventListener("progress", progreso, false);
  51.                         ajax.upload.addEventListener("progress", function(event){progreso(event, i)}, false);
  52.                         ajax.addEventListener("load", function(event){operacion_completada(event,i)}, false);
  53.                         ajax.addEventListener("error", mensaje_error, false);
  54.                         ajax.addEventListener("abort", abortar_subida, false);
  55.                         ajax.open("POST", "upload.php");
  56.                
  57.                         ajax.send(formdata);
  58.  
  59.                 })(i)
  60.             }
  61.         }
  62.  
  63.  
  64.         function progreso(event,nuar){
  65.            
  66.  
  67.             nutota = nuar;
  68.             nuesav = "avance" + nutota;
  69.             nubara = "nbarra" + nutota;
  70.            
  71.             document.getElementById("total").innerHTML = "Subidos "+ event.loaded+" bytes de "+event.total;
  72.             var percent = (event.loaded / event.total) * 100;
  73.             document.getElementById("progressBar").value = Math.round(percent);
  74.             document.getElementById(nubara).style.width = Math.round(percent)+'%';
  75.             document.getElementById(nuesav).innerHTML = Math.round(percent)+"% subiendo... por favor, espere";
  76.         }
  77.  
  78.         function operacion_completada(event,nuar) {
  79.  
  80.             nuesre = "textor" + nuar;
  81.             document.getElementById(nuesre).innerHTML = event.target.responseText;
  82.             document.getElementById("progressBar").value = 0;
  83.         }
  84.  
  85.         function mensaje_error(event) {
  86.  
  87.             document.getElementById("estado").innerHTML = "Error al subir el archivo";
  88.         }
  89.  
  90.         function abortar_subida(event) {
  91.        
  92.             document.getElementById("estado").innerHTML = "Upload Abort";
  93.         }


salu2.

Etiquetas: addeventlistener, ajax, argumentos, html, php, xmlhttprequest
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 16:13.