多个javascript上传按钮只将内容放在一个

时间:2016-03-16 01:56:08

标签: javascript upload haml image-uploading imagebutton

我试图制作两个上传按钮。一个是帐户徽标。

          .col-sm-6
            .wrapper
              Account Logo
              #account_logo
                = image_tag @account.logo.url, :class => 'account_logo'
                = file_field_tag 'account[logo]', :accept => 'image/png,image/jpeg'
                %a.btn.btn-default{:href => '#'} Choose file
                %span.notice
                  Only PNG or JPG please.

另一个是电子邮件徽标。

          .col-sm-6
            .wrapper
              Email Logo
              #email_logo
                = image_tag @account.email_logo.url, :class => 'email_logo'
                = file_field_tag 'account[email_logo]', :accept => 'image/png,image/jpeg'
                %a.btn.btn-default{:href => '#'} Choose file
                %span.notice
                  Only PNG or JPG please.

我添加了javascript,因此它适用于两者。但是,发生了一些非常错误的事情。我已经添加了尝试和调试的警报,他们告诉我,即使我点击#account_logo按钮,它也会进入#email_logo。有些javascript向导可以帮助我吗?

              :javascript
                var logo = ["#account_logo", "#email_logo"];

                for (var i = 0; i < logo.length; i++) {
                  var on_change = (logo[i] + ' input[type=file]');
                  var on_click = (logo[i] + ' a.btn');
                  var logo_img = (logo[i] + ' img');

                  $(document).on('click', on_click , function() {
                    alert("it is now " + on_click);
                    $(on_change).click();
                    alert("it is now " + on_change);
                  });
                  $(document).on('change', on_change, function() {
                    alert("it is now " + on_change);
                    var filelist = $(this).get(0).files;
                    var reader = new FileReader();
                    reader.onload = function (e) {
                      var url = e.target.result;
                      alert("it is now " + logo_img);
                      $(logo_img).attr('src', url);
                    }
                    reader.readAsDataURL(filelist[0]);
                  });
                }

2 个答案:

答案 0 :(得分:1)

可能是因为您使用的是for(var i = ...) {}循环结构,而不是logo.forEach(function(element) { ... })

可能发生这种情况的原因是因为JavaScript没有块作用域而是函数作用域,这意味着您的循环变量i在整个函数中可用,并且您的.on('change', ...)处理程序将引用此i作为变量,而不是变量在注册处理程序时的值。

尝试使用logo.forEach(function(element) { ... }构造,而不是设置var on_change = (logo[i] + 'input[type=file]');,而是var on_change = (element + 'input[type=file]');

答案 1 :(得分:0)

修改

啊哈,@ Frost找到了问题 - 变量范围。我自己会使用一个迭代器,但这里错过了效果范围对事件绑定的影响。

鉴于您已经在使用jQuery,并且可能比q.Store提供的浏览器兼容性更好,我强烈建议您使用forEach函数。您也可以内联logos数组,并直接传递click事件,给出:

jQuery.each

原始回复

对于没有太多问题描述,这似乎是很多代码。您是说事件处理程序都应用于$(["#account_logo", "#email_logo"]).each(function(logo) { $(logo + " input[type=file]").on("click", $(logo + " a.btn").click); // etc. }); ,还是两个按钮都执行#email_logo所需的操作?我之前没有完成文件上传,但是从快速回顾看,逻辑看起来很好。

如果您使用#email_logo而不是console.log,并在此处粘贴结果以及如何生成日志的说明,则会更容易看到问题。

我更愿意对此发表评论,但我没有足够的声誉。