Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.02.2018, 19:42
Аватар для kupidon
Аспирант
Отправить личное сообщение для kupidon Посмотреть профиль Найти все сообщения от kupidon
 
Регистрация: 18.03.2016
Сообщений: 69

Добавленная JS форма не хочет работать
Всем доброго дня.
Средствами php+html на страницу добавляю форму:
<form name="upload_form">
		<div id="imageloadbutton">
			<input id="photoimg" type="file" name="photos[]" multiple="true"/>
		</div>	
		<div id="imageloadstatus" style="display:none">
			<img src="include/upload_photo/loader.gif" alt="Загрузка ..."/><span>Идет загрузка...</span>
		</div>
</form>


Данная форма отлично работает. (обращаю внимание кнопки submit нет). По нажатию, открывается окно, выбираю стопку файлов , нажимаю ок, и все отправляется на сервер.

Решил малость переделать страницу. Теперь добавляю форму кодом js:
kod += '<form name="upload_form">';
    kod += '<div id="imageloadbutton">';
    kod += '<input id="photoimg" type="file" name="photos[]" multiple="true"/>';
    kod += '</div>	';
    kod += '<div id="imageloadstatus" style="display:none">';
    kod += '<img src="include/upload_photo/loader.gif" alt="Загрузка ..."/>';
    kod += '<span>Идет загрузка...</span>';
    kod += '</div>';
    kod += '</form>';


Отображается форма нормально, но судя по всему просит кнопку submit. То есть показывает что файлы выбраны, и на этом все...
Как сделать, чтобы форма работала без сабмита?

Обработчик выглядит так
$('#photoimg').change(function() { ......}
Ответить с цитированием
  #2 (permalink)  
Старый 06.02.2018, 19:47
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Обработчик после всех этих манипуляций назначен?
Ответить с цитированием
  #3 (permalink)  
Старый 07.02.2018, 07:29
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от kupidon
Как сделать, чтобы форма работала без сабмита?
form.submit(). Но в общем то зачем вообще нужна форма в таком случае, достаточно одного поля file, Ajax, FormData и обрабатывать прогресс загрузки вместо include/upload_photo/loader.gif.
Ответить с цитированием
  #4 (permalink)  
Старый 07.02.2018, 18:37
Аватар для kupidon
Аспирант
Отправить личное сообщение для kupidon Посмотреть профиль Найти все сообщения от kupidon
 
Регистрация: 18.03.2016
Сообщений: 69

Спасибо за внимание к моему вопросу. У меня скрипт обработки формы и скрипт вывода данной страницы находятся в одном файле. Структура его такая:
jQuery(document).ready(function ($){
....
тут скрипт ajax формы (см ниже)
...
}); 
.....
// нажатие на товар из списка для его последующего отображения
function open_item(iditem) {
 $.ajax({
    type: "POST",
    url: "adm_editpost.php",
    data: ("func=query_item&iditem="+iditem),
    dataType: "JSON",
    cashe: false,
    success: function(response){
      show_item(response);
     },
    error: (function() { 
    	alert("Ошибка выполнения"); 
    }),
 });
}
....




вот скрипт ajax-обработчик полностью:
// функция ajax загрузки фото 
// функция ajax загрузки фото 
 $('#photoimg').change(function() { 
  	  var file_data = $('#photoimg').prop('files');
      function count(obj) {
          var count = 0; 
          for(var prs in obj) { 
             if(obj.hasOwnProperty(prs)) count++;
    	  } 
          return count; 
      }
    for(var i = 0; i < count(file_data); i++){
		var file_dat000 = $('#photoimg').prop('files')[i];
		var form_data = new FormData();
    form_data.append('file', file_dat000);
    var iditem = $("#iditem").val();
    form_data.append('iditem', iditem);
    $.ajax({
                url: 'include/upload_photo/ajax_upload.php',
                dataType: 'text',
                cache: false,
                contentType: false,
                processData: false,
                data: form_data,
                type: 'post',
                beforeSend:function(){ 
					$("#imageloadstatus").show();
					$("#imageloadbutton").hide();
				},
                success: function(response){
	                $("#imageloadstatus").hide();
					$("#imageloadbutton").show();
                    //alert(response);
 					show_picture(response);
                },
                error: function(){
	 				$("#imageloadstatus").hide();
					$("#imageloadbutton").show();               	
                },
                complete: function(){
	 				$('#photoimg').val('');
                },
     });
	}
});
Ответить с цитированием
  #5 (permalink)  
Старый 07.02.2018, 19:32
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

var form_data = new FormData(); - должно объявляться один раз до цикла.

var file_dat000 = $('#photoimg').prop('files')[i];
form_data.append('file', file_dat000);

Это не правильно, массив $_FILES будет содержать только последний файл из присланных. Ключ может быть один, но содержать массив. А $('#photoimg').prop('files')[i] - это вообще не то.

А это что такое:

var iditem = $("#iditem").val();
form_data.append('iditem', iditem);

и тоже под одним ключом?
Ответить с цитированием
  #6 (permalink)  
Старый 07.02.2018, 19:41
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от kupidon
beforeSend:function(){
                    $("#imagel oadstatus").show();
                    $("#imagel oadbutton").hide();
                },
                success: function(response){
                    $("#imagel oadstatus").hide();
                    $("#imagel oadbutton").show();
                    //alert(response);
                    show_pictu re(response);
                },
                error: function(){
                    $("#imagel oadstatus").hide();
                    $("#imagel oadbutton").show();                  
                }
Это можно заменить на (вне ajax):

$(document).on({
        ajaxStart: /*действия при старте запроса*/,
        ajaxStop: /*действия по окончании запроса*/
    });


Это будет срабатывать для всех асинхронных запросов!
Ответить с цитированием
  #7 (permalink)  
Старый 07.02.2018, 19:56
Аватар для kupidon
Аспирант
Отправить личное сообщение для kupidon Посмотреть профиль Найти все сообщения от kupidon
 
Регистрация: 18.03.2016
Сообщений: 69

Сообщение от laimas Посмотреть сообщение
var form_data = new FormData(); - должно объявляться один раз до цикла.

var file_dat000 = $('#photoimg').prop('files')[i];
form_data.append('file', file_dat000);

Это не правильно, массив $_FILES будет содержать только последний файл из присланных. Ключ может быть один, но содержать массив. А $('#photoimg').prop('files')[i] - это вообще не то.

А это что такое:

var iditem = $("#iditem").val();
form_data.append('iditem', iditem);

и тоже под одним ключом?
Для одного товара я загружаю несколько изображений за один раз.
В форме я выделяю несколько файлов. Далее циклом перебираю эти файлы. Например беру один файл добавляю в formdata, добавляю туда же переменную ид товара (чтобы обработчик понял куда загружать файл и как прописать его в БД). И так, в цикле, каждый файл вместе с переменной отправляю в обработчик.
Все это работает
Ответить с цитированием
  #8 (permalink)  
Старый 07.02.2018, 20:18
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

var form_data = new FormData();
for(var i=0; i < this.files.length; i++) {
    form_data.append('file[]', this.files[i]);
}


Это все что требуется. И получите на сервере в $_FILES под ключом file массив загруженных файлов. Обходите его циклом, проверяя ключ error и если он равен 0, производите другие необходимые проверки и действия, загружая файлы в каталог.

Что такое $("#iditem").val(); и зачем?
Ответить с цитированием
  #9 (permalink)  
Старый 08.02.2018, 17:44
Аватар для kupidon
Аспирант
Отправить личное сообщение для kupidon Посмотреть профиль Найти все сообщения от kupidon
 
Регистрация: 18.03.2016
Сообщений: 69

Сообщение от laimas Посмотреть сообщение
Что такое $("#iditem").val(); и зачем?
Это ид товара. Передаю в обработчик файлы и номер товара. Использую его для для добавления записи фото по ID товара.

Подскажите пожалуйста в какое место файла добавить это скрипт- обработчик формы, чтобы он также полноценно работал? Подозреваю, что дело в области видимости вновь добавленной формы.
Ответить с цитированием
  #10 (permalink)  
Старый 08.02.2018, 18:17
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от kupidon
Это ид товара. Передаю в обработчик файлы и номер товара. Использую его для для добавления записи фото по ID товара.
Уже ведь говорилось, что при редактировании товара, его ID просто связать с именем поля file - name="file[id_товара]".

При этом товар уже может иметь ранее добавленные изображения, которые можно заменить на новые, только в этом случае полем file можно выбрать только один файл.

То есть сервер может получить для товара как новые файлы для замены имеющихся, так и новые добавляемые. И сделать это очень просто:

name="file[id_товара][id_изображения]" - это обновляемые изображения

name="file[id_товара][0][]" multyple - это новые, поле со множественным выбором

$_FILES будет содержать:

[file => [
    id_товара => [
        0 => [
             0 => [новое],
             1 => [новое],
             .....
        ],
         id_изображения => [обновление],
         id_изображения => [обновление],
         .....        
    ]
]


Что может быть проще. Если уж передавать id товара отдельно, то скрытым поле, а не через #id и целую кучу.

Сообщение от kupidon
в какое место файла добавить это скрипт- обработчик формы, чтобы он также полноценно работал?
Какой скрипт, что я привел?

Последний раз редактировалось laimas, 08.02.2018 в 18:19.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сломал всю голову.. Посмотрите спецы.. Не хочет работать страница в mozilla-firefox.. ProniK Ваши сайты и скрипты 1 02.06.2010 19:33
Заставить работать js подгружаемый AJAX -ом DeMONiZ AJAX и COMET 14 21.05.2010 10:52
Что-то onmouseup у меня не хочет правильно работать. vahrusha Элементы интерфейса 5 10.04.2010 00:00
Функция которая работает на OnLoad не хочет работать на OnClick libinstyle Элементы интерфейса 6 23.03.2010 01:42
GetElementById не хочет работать в динамической форме Игорёk Events/DOM/Window 8 23.06.2009 13:27