只有第一个文件输入响应事件侦听器
only first of multiple file inputs responds to event listener
我在一个页面上有多个表单,每个表单都有一个文件输入。当用户选择一个文件时,我想在相关表单内的<span class="fileNameBox"></span>
中打印所选文件的名称。
我有两个问题:
- 只有第一个输入会显示所选的文件名。
- 当点击
<label>
中特定输入的图像时,文件名总是显示在第一个"fileNameBox"中,而不是与<label>
相关联的文件名。
我怎样才能解决这两个问题?
$(function() {
document.querySelector('input[name="file[]"]').onchange = function(e) {
var files = this.files;
var filename = files[0].name;
$(this).closest('form').find('.fileNameBox').html(filename);
};
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form class="form-horizontal" action='#' method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-8 col-xs-12">
<span class="fileNameBox"></span>
<input type='file' name='file[]' class=' form-control file-field hideBox' maxlength='1' accept='gif|jpg|png|bmp' id="uploadFile" />
</div>
<label class="col-md-1 col-xs-1 control-label" for="uploadFile">
<img src="images/photoIconOn.png" alt="" class="uploadFileImg" />
</label>
</div>
</form>
<form class="form-horizontal" action='#' method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-8 col-xs-12">
<span class="fileNameBox"></span>
<input type='file' name='file[]' class=' form-control file-field hideBox' maxlength='1' accept='gif|jpg|png|bmp' id="uploadFile" />
</div>
<label class="col-md-1 col-xs-1 control-label" for="uploadFile">
<img src="images/photoIconOn.png" alt="" class="uploadFileImg" />
</label>
</div>
</form>
<form class="form-horizontal" action='#' method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-8 col-xs-12">
<span class="fileNameBox"></span>
<input type='file' name='file[]' class=' form-control file-field hideBox' maxlength='1' accept='gif|jpg|png|bmp' id="uploadFile" />
</div>
<label class="col-md-1 col-xs-1 control-label" for="uploadFile">
<img src="images/photoIconOn.png" alt="" class="uploadFileImg" />
</label>
</div>
</form>
document.querySelector
"返回文档中的第一个元素…匹配指定的选择器组的。"因此,只返回页面上第一个匹配的输入。
您可以使用document.querySelectorAll
并为返回的每个元素附加一个侦听器。但是,由于您已经在使用jQuery,我建议使用jQuery来选择输入:
$(function() {
$('input.form-control').on('change', function(e) {
var files = this.files,
filename = files[0].name;
$(this).closest('form').find('.fileNameBox').html(filename);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form class="form-horizontal" action='#' method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-8 col-xs-12">
<span class="fileNameBox"></span>
<input type='file' name='file[]' class=' form-control file-field hideBox' maxlength='1' accept='gif|jpg|png|bmp' />
</div>
</div>
</form>
<form class="form-horizontal" action='#' method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-8 col-xs-12">
<span class="fileNameBox"></span>
<input type='file' name='file[]' class=' form-control file-field hideBox' maxlength='1' accept='gif|jpg|png|bmp' />
</div>
</div>
</form>
<form class="form-horizontal" action='#' method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-8 col-xs-12">
<span class="fileNameBox"></span>
<input type='file' name='file[]' class=' form-control file-field hideBox' maxlength='1' accept='gif|jpg|png|bmp' />
</div>
</div>
</form>
编辑
此外,似乎您指的是单击<label>
图像仅选择第一个输入的事实。这是因为所有输入都具有相同的ID。id必须是唯一的,像这样:
<input type='file' name='file[]' id="uploadFile1" />
<input type='file' name='file[]' id="uploadFile2" />
<input type='file' name='file[]' id="uploadFile3" />
作为替代方案,我已经完全删除了id,并将每个<input>
放在其<label>
中。参考,请参见MDN的"label"示例。
请参阅下面的工作示例:
$(function() {
$('input.form-control').on('change', function(e) {
var files = this.files,
filename = files[0].name;
$(this).closest('form').find('.fileNameBox').html(filename);
});
});
img.uploadFileImg {
vertical-align: top;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form class="form-horizontal" action='#' method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-8 col-xs-12">
<label class="col-md-1 col-xs-1 control-label">
<img src="http://lorempixel.com/20/20/abstract/2/" alt="" class="uploadFileImg" />
<span class="fileNameBox"></span>
<input type='file' name='file[]' class='form-control file-field hideBox' maxlength='1' accept='gif|jpg|png|bmp' />
</label>
</div>
</div>
</form>
<form class="form-horizontal" action='#' method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-8 col-xs-12">
<label class="col-md-1 col-xs-1 control-label">
<img src="http://lorempixel.com/20/20/abstract/2/" alt="" class="uploadFileImg" />
<span class="fileNameBox"></span>
<input type='file' name='file[]' class='form-control file-field hideBox' maxlength='1' accept='gif|jpg|png|bmp' />
</label>
</div>
</div>
</form>
<form class="form-horizontal" action='#' method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-8 col-xs-12">
<label class="col-md-1 col-xs-1 control-label">
<img src="http://lorempixel.com/20/20/abstract/2/" alt="" class="uploadFileImg" />
<span class="fileNameBox"></span>
<input type='file' name='file[]' class='form-control file-field hideBox' maxlength='1' accept='gif|jpg|png|bmp' />
</label>
</div>
</div>
</form>
相关文章:
- 在Javascript中的ajax响应之后未调用Dropdown事件
- Ember视图未响应用户启动的事件
- 如何使用更新图像源以响应新闻事件
- 为什么我没有得到对Comet服务器流事件的实时响应
- 基于类的单击事件在10行之后不响应-数据表
- EventSource 的响应具有非“文本/事件流”的 MIME 类型(“文本/纯文本”)
- 为什么不是't html<对象>元素响应鼠标事件
- jquery多个事件响应
- 使用命名函数设置多个事件响应
- 加载超链接页面后如何响应事件
- 响应菜单问题-如何在移动环境中处理HREF和onclick事件
- 尝试使用鼠标点击事件响应编写jQuery HTML5聊天框程序
- 节点 js 中的请求和响应事件如何彼此不同
- 如何为每个 AJAX 请求/响应事件添加回调
- 主干模板中的 DOM 元素不响应事件
- 如何使用 socket.io 发出事件以响应事件
- JS函数不响应事件onclick
- 如何在不占用空间的情况下隐藏元素,同时还能响应事件
- Angularjs指令在link函数中没有响应事件绑定
- 只有第一个文件输入响应事件侦听器