javascript - 如何控制动态添加的输入类型文件?

标签 javascript jquery spring jsp

我正在尝试获取动态添加的输入类型文件的大小。

JSP

 <div>
    <button type="button"  id="appendTab" name="appendTab">Append</button>
    <button type="button"  id="deleteTab" name="deleteTab">Delete</button>  
 </div>
 <table id="bnspTable" class="table">
    <thead>
         <tr>
             <th style="width:8%;">check</th>
             <th colspan="2" style="text-align:center; width:82%">FileName</th>
             <th style="text-align:center; width:10%">FileSize</th>
         </tr>
    </thead>
    <tbody id="fileTbody">
    </tbody>
 </table>

JS

 $("#appendTab").on("click",function(){
        page.appendTab();
 })
 page.appendTab = function(){
    var cnt = $("#fileTbody tr").length + 1;

    var addHtml = '<tr class="addFile" style="text-align:center;">';
    addHtml += '<td><input type="checkbox" name="P_CHECK" style="width:25px; height:25px;"></td>';
    addHtml += '<td colspan="2"><input type="text" name="uploadName" size="70" readonly><input type="file" id= "file_nm' +cnt+'" name="P_ORG_FILE_NM" class="fileNM" onchange="sizeCheck()"></td>';
    addHtml += '<td><input type="text" name="fileSize" readonly size="10"></td>';
    addHtml += '</tr>';
    $("#bnspTable").find('tbody').append(addHtml);
  }; //Ability to add rows to tbody

 sizeCheck = function(){
    $(document).on('change','.fileNM',(function(){

        var file = this.files[0];
        var fileName = file.name;
        var fileSize = file.size;
        $("input[name='fileSize']").val(fileSize);
    }));
  /* 
  At first,i can do it by giving a class, but it will be overwritten with the file size added 
  later.*/
};

一开始,我可以通过提供一个类来做到这一点,但它会被添加的文件大小覆盖 稍后。

我试图通过 id 进行控制,但它不起作用,所以我将通过名称来进行控制。 当我添加文件时,我想将文件的大小放入输入中,名称=“fileSize”

但是,我不知道会添加多少文件,所以我不知道该怎么办。

最佳答案

这里有两个主要问题。首先,由于您在这里正确使用了委托(delegate)事件处理程序,因此您只需要实例化它一次,而不是在 sizeCheck() 函数中实例化它。这样做将意味着处理程序被绑定(bind)多次,这是您最不需要的事情。因此,将 on() 调用移至该函数之外,并从 HTML 中删除 onclick

第二个问题是您在更改处理程序中选择所有 input[name='fileSize'] 元素,而您只需要找到相关的一个触发事件的文件输入。为此,请使用 jQuery 的 DOM 遍历方法,在本例中为 closest()find()

话虽如此,试试这个:

let page = {};
page.appendTab = function() {
  var addHtml = '<tr class="addFile">';
  addHtml += '<td><input type="checkbox" name="P_CHECK"></td>';
  addHtml += '<td colspan="2"><input type="text" name="uploadName" size="70" readonly><input type="file"  name="P_ORG_FILE_NM" class="fileNM"></td>';
  addHtml += '<td><input type="text" name="fileSize" readonly size="10"></td>';
  addHtml += '</tr>';
  $("#bnspTable").find('tbody').append(addHtml);
};

$("#appendTab").on("click", function() {
  page.appendTab();
})

$(document).on('change', '.fileNM', (function() {
  var file = this.files[0];
  var fileName = file.name;
  var fileSize = file.size;
  $(this).closest('tr').find('input[name="fileSize"]').val(fileSize);
}));
.addFile {
  text-align: center;
}

.addFile input[type="checkbox"] {
  width: 25px;
  height: 25px;
}

tr th:nth-child(1) {
  width: 8%;
}

tr th:nth-child(2) {
  text-align: center;
  width: 82%
}

tr th:nth-child(3) {
  text-align: center;
  width: 10%
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <button type="button" id="appendTab" name="appendTab">Append</button>
  <button type="button" id="deleteTab" name="deleteTab">Delete</button>
</div>
<table id="bnspTable" class="table">
  <thead>
    <tr>
      <th>check</th>
      <th colspan="2">FileName</th>
      <th>FileSize</th>
    </tr>
  </thead>
  <tbody id="fileTbody"></tbody>
</table>

顺便说一句,不要使用增量 id 属性。这是一种反模式,因为它会创建更复杂、更冗长的代码,而且更难维护。无论如何,当正确使用 DOM 遍历时,你根本不需要它们。此外,不要使用内联 style 属性。将所有样式规则放入外部样式表中。

关于javascript - 如何控制动态添加的输入类型文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60722606/

相关文章:

java - Extjs 和 Spring MVC XMLHttpRequest 无法加载预检响应具有无效的 HTTP 状态代码 403

java - 使用 @ImportResource 注释获取对 ApplicationContext 的引用?

javascript - React中如何实现 "normal"ES5原型(prototype)继承?

javascript - 以父组件内对象的形式从所有子组件获取合并数据 : React JS

Javascript 在文本框后面显示验证消息

jquery - 使用 JQuery 隐藏/显示 div 的更简单方法

java - 尝试对 DAO 类进行单元测试时,SessionFactory 没有 Autowiring

javascript - Phonegap 和 jQuery Mobile 架构问题

Javascript - 将 HTML 输入字符串转换为数学计算

javascript - 调整浏览器大小时重置 css 或脚本