JavaScript foreach每次给我相同的值

问题描述:

我有一个JavaScript的foreach函数一次上传多个文件,并显示他们在一个div与他们的百分比上传。我的问题,我只是现在测试,我做了一个变量,以获得输入中的每个文件的名称,但有一个输入中有多个文件,所以我提醒我所做的变量获取文件的名称,但我得到了惊动每次最后一个文件。下面是我的代码。JavaScript foreach每次给我相同的值

$('#File').change(function(event) { 
     for(I = 0; I < this.files.length; I++) 
     { 
      var Name = this.files[I].name; 
      var Type = this.files[I].type; 
      var Size = this.files[I].size; 

      var Add = ''; 
      Add += '<div class="UploadLabel" style="width:60%;">'+Name+'</div>'; 
      Add += '<div id="UpPer" class="UploadLabel" style="width:10%;">0%</div>'; 
      Add += '<div class="UploadLabel" style="width:15%;">N/A</div>'; 
      Add += '<div class="UploadLabel" style="width:15%;">'+Type+'</div>'; 
      $('#UploadContent').append(Add); 

      var Data = new FormData(); 
      Data.append('File[]', this.files[I]); 
      var Request = new XMLHttpRequest(); 

      Request.upload.addEventListener('progress', function(event) { 
       if(event.lengthComputable) 
       { 
        var Percent = event.loaded/event.total; 
        alert(Name); 
       } 
      }); 

      Request.open('POST', 'Upload/Upload.php'); 
      Request.setRequestHeader('Cache-Control', 'no-cache'); 
      Request.send(Data); 
      $('#UploadModal').fadeIn('fast'); 
     } 
    }); 

查看进度函数,我提醒Name变量。

+0

你没有使用foreach循环。 – 2013-04-06 15:18:41

+0

你的变量'I'目前隐含地是全局的。你可能应该在循环之上使用'var I;'声明它。 – jwueller 2013-04-06 15:20:29

+0

可能重复[Javascript闭合内部循环 - 简单实用的例子](http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – Bergi 2013-04-06 15:24:17

这是因为您的变量Name具有调用回调时的循环结束值。

可以保护这个变量,但立即打电话功能:

(function(Name){ 
    Request.upload.addEventListener('progress', function(event) { 
     if(event.lengthComputable){ 
       var Percent = event.loaded/event.total; 
       alert(Name); 
     } 
    }); 
})(Name); 

这中间函数创建,其中新名称变量被保护的范围。另外,如果你需要其他的变量,你可以声明一个围绕整个循环内容的函数,其中I

你也可以使用了jQuery的each

$.each(this.files, function(I) { 
     // the content of your loop 
}); 

的使用功能由each叫也创造了名的所需值的范围。

+0

工作,但它现在警报相同名称两次,然后移动到下一个名称并提醒两次,等等...... – 2013-04-06 15:19:45

+0

@MoussaHarajli这很正常:[进度事件](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest#Monitoring_progress)可以很好地发送多次。 – 2013-04-06 15:23:23

+0

好的,谢谢! – 2013-04-06 15:25:10