【发布时间】:2017-01-03 22:55:16
【问题描述】:
我想要做的是有一个模态表单,其中包含一个文件输入以及各种其他表单字段,然后,一旦提交了模态表单,文件输入以及其他表单元素就会移动到我最终要提交的主表单,然后我重置表单并用原始文件的克隆替换原始文件输入,以便接受更多条目。
除了 html 5 图像预览不适用于任何克隆的文件输入之外,一切都运行良好,因此它仅适用于页面加载时出现的原始文件输入,而不适用于任何后续输入。
我已尝试更改事件处理程序以及在将克隆添加到 DOM 后调用 handleImages,但似乎两者都没有影响,我想不出下一步该尝试什么。
我做了一个codpen,代码也在下面:
HTML
<div class="container">
<form action="" class="form-inline" id="image-form">
<label class="btn btn-info upload-button">
Tap to Select Images
<input type="file" style="display: none" multiple accept="image/*" capture="camera">
</label>
<button type="button" class="btn btn-primary" id="save-image">Save Images</button>
<div class="preview">
<div class="row">
</div>
</div>
</form>
<div id="saved-images" style="display: none;"></div>
</div>
JS
var imageCount = 0;
var ImageUpload = function() {
var handleImages = function() {
document.querySelector('#image-form input[type="file"]').addEventListener('change', handleFileSelect, false);
// also tried
// $(document).on('change', '#image-form input[type="file"]', handleFileSelect);
}
var handleFileSelect = function(e) {
if ( !e.target.files || !window.FileReader) return;
var $element = $(e.srcElement).closest('form').find('.preview > .row');
$element.empty();
var $srcElement = $(e.srcElement);
var files = e.target.files;
var filesArr = Array.prototype.slice.call(files);
filesArr.forEach(function(f) {
if (!f.type.match("image.*")) {
return;
}
var reader = new FileReader();
reader.onload = function(e) {
var html = `
<div class="col-lg-3 col-md-4 col-xs-6 thumbnail m-t m-b m-r m-l">
<img class="img-responsive" src="${e.target.result}" alt="${f.name}">
<div class="title bg-success">${f.name}</div>
</div>
`;
$element.append(html);
}
reader.readAsDataURL(f);
});
}
var handleSaveImage = function() {
$(document).on('click', '#save-image', function(f) {
// Clone the "real" input element
var $real = $('#image-form input[type="file"]');
var $clone = $real.clone(true);
/* Also tried:
var $clone = $real.clone(false);
handleImages();
and
var $clone = $real.clone(true).val('');
*/
// Put the cloned element directly after the real element
$clone.insertAfter($real);
// change the name and class of the real input
$real.addClass(`image-${imageCount}`);
// Move the real element
$real.appendTo('#saved-images');
imageCount++;
resetImageForm();
});
}
var resetImageForm = function() {
$('#image-form').trigger('reset');
$('#image-form .preview').empty();
}
return {
// main function to initiate the module
init: function() {
handleImages();
handleSaveImage();
}
};
}();
jQuery(document).ready(function() {
ImageUpload.init();
});
如果我将事件侦听器更改为$(document).on('change', '#image-form input[type="file"]', handleFileSelect);,那么每次都会到达预览代码但没有预览,这是一个分叉版本来说明我的意思enter link description here
【问题讨论】:
-
我不得不说我不确定问题出在哪里。只是不明显。你能更好地描述它或建立一个更明显的例子吗?
-
嗨,Serg,当然。如果您在文件上传中选择图像然后“保存”,它会克隆它以进行替换,然后将该输入移动到其他地方。如果您随后对克隆的元素重复该过程,则除图像预览外,一切正常。
标签: javascript jquery html ecmascript-6