У меня есть код ниже, который загружает и отображает предупреждение о загруженном файле. Однако, поскольку я добавляю материал к имени файла, когда он сохраняет его на моем сервере, идентификатор, подобный выполненной функции внутри jquery, обновляет значение скрытого поля с сохраненным именем файла. Я думал, что это будет просто, но это не так. Позвольте мне показать вам код, с которым я работаю:
функция для загрузки файлов каждой формы с добавленным элементом. Это работает так, как должно:
function bindFileUpload() {
$('.fileupload').fileupload({
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
alert(file.name);
});
}
});
};
Код, который я использую для добавления дополнительных форм, приведен ниже. Опять же, это прекрасно работает в сочетании с вышеупомянутой функцией. Вход, который я хочу установить, равен .itemPhotoFile
$(document).on('click','.addItem', function(){
$('<!--ROW START-->\
<form class="widget-content item">\
<div class="row">\
<div class="col-md-3"><input type="text" class="form-control" name="itemName[]"></div>\
<div class="col-md-3"><textarea class="auto form-control" name="itemDescription[]" cols="20" rows="1" style="word-wrap: break-word; resize: vertical;"></textarea></div>\
<div class="col-md-3"><textarea class="auto form-control" name="itemCondition[]" cols="20" rows="1" style="word-wrap: break-word; resize: vertical;"></textarea></div>\
<input type="hidden" class="itemId" name="itemId[]" value="">\
<input type="hidden" class="itemPhotoFile" name="itemPhoto[]" value="">\
<input type="hidden" name="itemInventoryId[]" value="<?=$_GET["inventory_id"]?>">\
<input type="hidden" name="itemParent[]" value="'+$(this).closest('.formHolder').data('parent-room')+'">\
<div class="col-md-2">\
<div class="fileinput-holder input-group" data-item-id="">\
<!-- <div class="uploadPhotoBox">Upload Photo</div> -->\
<input class="fileupload" type="file" name="files[]" data-url="uploads/">\
</div>\
</div>\
<div class="col-md-1 align-center"><i class="save icon-ok large"> </i> <i class="delete icon-trash large"> </i></div>\
</div>\
</form>\
<!--/ROW END-->').fadeIn(500).appendTo($(this).parents().siblings('.items')).each(function(){
bindFileUpload();
});
$(this).parents().siblings('.widget-header, .header-margin, .hide').removeClass('hide').fadeIn();
});
Я пробовал идеи, такие как:
function bindFileUpload() {
$('.fileupload').fileupload({
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
alert(file.name);
$(this).closest('.itemPhotoFile').val(file.name);
});
}
});
};
но не повезло, я не думаю, что он знает, что $(this)
правильно и не может найти вход. Я не могу найти значение поля ввода BEFORE, поскольку это не окончательное имя файла. Поэтому важно, чтобы он работал ПОСЛЕ успеха загрузки.
Благодарю!
Вы захотите выполнить поиск внутри "формы", которая передается внутри аргумента данных:
function bindFileUpload() {
$('.fileupload').fileupload({
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
alert(file.name);
data.form.find('.itemPhotoFile').val(file.name);
});
}
});
};
Внутри $.each()
this
текущий элемент итерации. Но даже если это не так, я не думаю, что плагин загрузки файлов связывает this
в .done
с исходным элементом. Поэтому я думаю, что вам нужно сделать это явно с помощью цикла:
function bindFileUpload() {
$('.fileupload').each(function() {
var $that = $(this);
$that.fileupload({
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
alert(file.name);
$that.closest('.itemPhotoFile').val(file.name);
});
}
});
});
};