代码之家  ›  专栏  ›  技术社区  ›  Anil Namde

如何将其他参数传递给javascript事件对象?

  •  3
  • Anil Namde  · 技术社区  · 14 年前

    我使用HTML5文件阅读器异步读取多个文件。

    现在,我为每个图像创建了背景为0%的div,但我不清楚如何在onprogress事件中传递这个分区的id或引用,以便跟踪进度并动态更新div内容。

    简单地说,让我知道如何确保我更新与文件相关的正确的进度控制,当多个文件同时上载?我的JS不对。

    var up_file = document.getElementById('multiple_file'); 
            if(up_file.files)
            {   
                for(var x=0; x <up_file.files.length; x++)
                {
                    //console.log(up_file.files.length);
                    var file = up_file.files[x];
    
                    var loadingDiv = document.createElement("div");
                    var container = document.getElementById('loading_container');   
    
                    loadingDiv.className = "loading";
                    loadingDiv.id ="loading_" + x;
                    loadingDiv.innerHTML = '0%';
                    container.appendChild(loadingDiv);
    
    
                    var reader = new FileReader();  
    
                    reader.onprogress = function (evt) {
                      if (evt.lengthComputable) {
                      console.dir(evt);
                        // evt.loaded and evt.total are ProgressEvent properties
                        var loaded = (evt.loaded / evt.total);
                        if (loaded < 1) {
                            console.log(loaded);
                        }
                      }
                    }
    
                    var img = document.createElement("img");
                    img.className = "hide";
                    reader.onload = (function(aimg) {
                        return function(e) {
                            LIB.addEvent(aimg, "load", function(){
                                var scale = 1;
                                scale = aimg.width / 200;
                                aimg.width = aimg.width  / scale;
                                aimg.className = "show";
                            }, false);
                            aimg.src = e.target.result; 
                            var li = document.createElement("li");
                            li.appendChild(aimg);
                            document.getElementById('img_packet').appendChild(li);
                        };
                    })(img);
                    reader.readAsDataURL(file);
                }
            }
    
    1 回复  |  直到 14 年前
        1
  •  4
  •   bobince    14 年前

    loadingDiv 仍然可以看到 onprogress onprogress公司 被称为, 加载div 可能会被赋予一个新的值。

    加载div :

    reader.onprogress= function(myloadingdiv) {
        return function(evt) {
            if (evt.lengthComputable)
                myloadingdiv.innerHTML= evt.loaded/evt.total*100+'%';
        };
    }(loadingDiv);
    

    bind() 方法将更干净地为您执行此操作:

    reader.onprogress= function(myloadingdiv, evt) {
        if (evt.lengthComputable)
            myloadingdiv.innerHTML= evt.loaded/evt.total*100+'%';
    }.bind(loadingDiv);
    

    绑定() 但是,您可以通过以下方式修补实现:

    if (!('bind' in Function.prototype)) {
        Function.prototype.bind= function(owner) {
            var that= this;
            if (arguments.length<=1) {
                return function() {
                    return that.apply(owner, arguments);
                };
            } else {
                var args= Array.prototype.slice.call(arguments, 1);
                return function() {
                    return that.apply(owner, arguments.length===0? args : args.concat(Array.prototype.slice.call(arguments)));
                };
            }
        };
    }