#javascript #jquery #ajax #forms #image-uploading
#javascript #jquery #ajax #формы #загрузка изображения
Вопрос:
У меня есть эта форма для изменения изображения профиля пользователя. Я пытаюсь изменить изображение при нажатии на текущее изображение и выбрать из файловой системы пользователя
Форма:
<form id="changeProfilePicForm" action="<?=base_url()?>user/change_profile_pic" method="post" accept-charset="utf-8" enctype="multipart/form-data">
<div data-content="Click To update" class="image" id="profile-image">
<input id="profile-image-upload" class="hidden" name="image" type="file" accept="image/x-png, image/gif, image/jpeg">
<?if(strlen($user['image'])){?>
<img src="<?=base_url().'uploads/profile/'.$user['image']?>" class="img-circle" alt="user profile pic" height="125px" width="125px">
<?}else{?>
<img src="<?=base_url()?>includes/img/avtar.png" class="img-circle" alt="user profile pic" height="125px" width="125px">
<?}?>
<input type="submit" class="hidden">
</div>
</form>
Javascript:
$("#changeProfilePicForm").on('submit',(function(e){
e.preventDefault();
var $form = $( this );
$.ajax({
url: $form.attr( 'action' ),
type: "POST",
data: new FormData($form),
contentType: false,
cache: false,
processData:false,
success: function(data){
console.log(data);
},
error: function(data){
console.log(data);
}
});
}));
document.getElementById('profile-image').onclick = function() {
document.getElementById('profile-image-upload').click();
};
document.getElementById('profile-image-upload').onchange = function(){
document.getElementById('changeProfilePicForm').submit();
};
PHP-контроллер:
public function change_profile_pic()
{
$user_id = $this->session->user_id;
$image = $this->uploadimage();
if(strlen($image)){
$user_data['image'] = $image;
$updated = $this->user_model->update_user($user_id, $user_data);
$data['response'] = 1;
$data['image'] = $image;
// redirect(base_url()."user");
echo json_encode($data);
}else{
$data['response'] = 0;
$data['message'] = "error";
echo json_encode($data);
}
//redirect(base_url()."user");
}
Проблема, с которой я сталкиваюсь, заключается в том, что форма не отправляется через ajax. Это каталог, представленный в виде простой формы. Я не могу понять, что не так с кодом, поскольку изображение загружается при простой отправке формы. Есть ли какие-либо проблемы с привязкой события или я чего-то здесь не хватает?
Комментарии:
1. Это может быть связано с тем, что вы запускаете ajax внутри
$("#changeProfilePicForm").on('submit',
события on change дляprofile-image-upload
запуска отправки без участия ajax.2. добавьте
return false;
после$.ajax(....);
, чтобы игнорировать отправку формы
Ответ №1:
Когда вы вызываете
document.getElementById('changeProfilePicForm').submit();
submit
событие не запускается. Попробуйте
$('#changeProfilePicForm').trigger('submit');
Редактировать. Избавьтесь от формы в html:
<input type="file" id="image">
js:
function handleUpload(event) {
var file = this.files[0];
if (!file) return;
var formData = new FormData();
formData.append('file', file);
return $.ajax({
type: 'POST',
url: '/images',
data: formData,
processData: false,
contentType: false,
//...
});
}
$('#image').on('change', handleUpload);
Комментарии:
1. это сработало, но теперь изображение не публикуется через ajax. Есть ли какая-либо конкретная причина, по которой событие отправки не было запущено?
2. Конкретная причина заключается в том, что вызов действия над элементом DOM через JS не запускает события, как это было бы естественным образом. Т.Е. если вы вызываете
$('#btn').click()
or$('#form').submit()
, это не вызовет обработчики событий, прослушивающие событияclick
илиsubmit
. Я бы предложил избежать этой.on('submit
)` логики, перейдя$.ajax
к отдельной функции и вызывая эту функцию при изменении ввода файла.
Ответ №2:
Я полагаю, что FormData ожидает собственный элемент формы $form[0]
, а не элемент формы jQuery $form
.
$("#changeProfilePicForm").submit(function (e) {
e.preventDefault();
var $form = $(this);
$.ajax({
url: $form.attr('action'),
type: "POST",
data: new FormData($form[0]),
contentType: false,
cache: false,
processData: false,
success: function (data) {
console.log(data);
},
error: function(data){
console.log(data);
}
});
}));