我试图制作两个上传按钮。一个是帐户徽标。
.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]);
});
}
答案 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
,并在此处粘贴结果以及如何生成日志的说明,则会更容易看到问题。
我更愿意对此发表评论,但我没有足够的声誉。