jQuery克隆表格行后图片无法修改、input未正确克隆如何解决?
问题根源
问题核心是三个原因共同导致的:
- 页面元素ID重复:原始代码中图片预览标签、文件选择input都用了固定ID
preview和file,克隆行之后页面存在多个相同ID的元素,JS用getElementById取值/赋值时只会匹配第一个找到的元素,自然会出现修改混乱、新行不生效的问题。 - 文件选择框定位错误:原始代码中文件input用了固定的left/top绝对定位,父容器没有设置相对定位,导致所有克隆行的input都堆叠在页面同一个位置,点击新行的图片实际触发的还是第一行的input,自然没法修改新行的图片。
- 浏览器安全限制:出于安全考虑,JS无法克隆文件input中已选择的本地文件,所以克隆行只能同步原行的预览图片,无法同步已选择的文件对象。
修复方案
1. 修改HTML模板
调整图片区域的结构、样式,把固定ID替换为class,修改onchange事件传参:
<!-- 把原来图片所在的div替换成下面的结构 --> <div style="position: relative;width: 100%;height: 50px;"> <img class="preview" src="https://d1muf25xaso8hp.cloudfront.net/https%3A%2F%2Fs3.amazonaws.com%2Fappforest_uf%2Ff1595928150631x625876263392768800%2Ffoodimage.png?w=64&h=64&auto=compress&dpr=1.25&fit=max" style="display: block; margin: 0px; width: 100%; height: 50px; border-radius: 0px;"> <input type="file" name="file[]" class="file-input" accept="image/*" onchange="previewImage(this);" style="opacity: 0;position: absolute;z-index: 15;cursor: pointer;left: 0;top: 0;width: 100%;height: 100%;"> </div>
2. 修改图片预览函数
不再用ID查找元素,改为基于当前触发的input向上查找对应行的预览图:
function previewImage(input) { var file = input.files; if (file.length > 0) { var fileReader = new FileReader(); var previewImg = input.previousElementSibling; fileReader.onload = function(event) { previewImg.setAttribute("src", event.target.result); }; fileReader.readAsDataURL(file[0]); } }
3. 优化克隆行逻辑
克隆后清空新行的文件input值,避免和原行冲突:
$(document).on('click', ".btn_row_below_clone", function(e) { var originalRow = $(this).closest('tr'); var newRow = originalRow.clone(); // 清空新行的文件input值 newRow.find('.file-input').val(''); originalRow.after(newRow); });
4. 可选优化:新增行逻辑修复
原来的新增行逻辑是直接清空td所有内容,会导致新增行没有输入控件,建议改为克隆之后重置所有控件值即可:
$(document).on('click', ".btn_row_below_new", function(e) { var originalRow = $(this).closest('tr'); var newRow = originalRow.clone(); // 重置所有输入控件 newRow.find('textarea').val(''); newRow.find('select').prop('selectedIndex', 0); newRow.find('input[type="number"]').val(''); newRow.find('.file-input').val(''); // 恢复预览图为默认图 newRow.find('.preview').attr('src', 'https://d1muf25xaso8hp.cloudfront.net/https%3A%2F%2Fs3.amazonaws.com%2Fappforest_uf%2Ff1595928150631x625876263392768800%2Ffoodimage.png?w=64&h=64&auto=compress&dpr=1.25&fit=max'); originalRow.after(newRow); });
内容的提问来源于stack exchange,提问作者Mike Doss
相关产品推荐
相关产品推荐

