Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.04.2018, 12:57
Аспирант
Отправить личное сообщение для Lion_astana Посмотреть профиль Найти все сообщения от Lion_astana
 
Регистрация: 19.11.2010
Сообщений: 48

Рекурсивный вызов в IE и Прогрессбар при загрузке файлов
Всем привет.

Попробую 2 проблемы описать сразу, чтобы не плодить кучу тем. Сейчас пытаюсь разработать простенькую функцию загрузки файлов на сервер с помощью AJAX без всяких плагинов и прочего.

Есть простая форма на странице, код JS и PHP обработчик файлов.

В JS есть функция, которая вызывается при загрузке DOM и подгружает методом .load картинки. После ее отработки в ней же есть метод .ajax, который из формы берет файлы и загружает на сервер. В success стоит вызов снова этой же функции, но это не работает именно в IE (10).

Вот часть кода:

var getLogo = function(){
		var lb = $("#logoBlock");
		$(lb).load("/load/logo.php",function(){
			
			var files;
			$("#logoFile").change(function(){
				files = this.files;
			});				
			$('#submitLogo').click(function(){	// Загрузка логотипа
				var self = $(this);
				// Создадим данные формы и добавим в них данные файлов из files
				if (typeof files == 'undefined'){
						showMsg("Вы не указали файл логотипа!");
						return false;		
				};
				var data = new FormData();
				data.append("userfile", $("#logoFile")[0].files[0]);				
				
				// Отправляем запрос
		 
				$.ajax({
					url: '/action/logoUpload.php',
					type: 'POST',
					data: data,
					cache: false,
					dataType: 'json',
					processData: false,
					contentType: false, 
					xhr: function(){
						var progressBar = $('#progressbar');
						var xhr = $.ajaxSettings.xhr(); // получаем объект XMLHttpRequest
						xhr.upload.addEventListener('progress', function(evt){ // добавляем обработчик события progress (onprogress)
						  if(evt.lengthComputable) { // если известно количество байт
							// высчитываем процент загруженного
							var percentComplete = Math.ceil(evt.loaded / evt.total * 100);
							// устанавливаем значение в атрибут value тега <progress>
							// и это же значение альтернативным текстом для браузеров, не поддерживающих <progress>
							progressBar.val(percentComplete).text('Загружено ' + percentComplete + '%');
						  }
						}, false);
						return xhr;
					},					
					success: function(data){			
						if(data.type == "success"){
							showMsg(data.answer);
							getLogo();
						}else{
							showMsg(data.answer);
						}
					}
				});
				return false;
			});				
			
		});
	}
	getLogo();


Получается 2 проблемы:

1) в IE 10 в success не срабатывает getLogo();

2) Прогрессбар не работает, точнее он в один момент заполняется,а потом стоит и ждет оставшуюся загрузку, а это не пойдет ))) При небольшой модификации скриптов и выполнении мультизагрузки нескольких изображений, прогрессбар был бы очень кстати, можно даже не анимированная полоска, а даже удобнее цифры от 0 до 100%. Как высчитать общий объем суммы файлов, как узнать сколько уже загружено, как это передавать п процессе загрузки????

При мультизагрузке нескольких изображений одновременно прогрессбар вообще не движется.
кстати вот он в форме после инпута с файлом:
<progress id='progressbar' value='0' max='100'></progress>



Кто-нибудь сталкивался с этими проблемами? Буду очень признателен, если подскажете куда копать!


Заменил сейчас кусок с xhr на такой:
xhr: function(){
						var xhr = $.ajaxSettings.xhr(); // получаем объект XMLHttpRequest
						xhr.upload.onprogress = function(evt) {
						  $('.ajax-respond').text( 'Загружено на сервер ' + evt.loaded + ' байт из ' + evt.total );
						}
						return xhr;
					  },

Чтобы посмотреть как оно работает и увидеть в определенном div-е результат.
Так вот, результат в див выводится сразу, а загрузка продолжается дальше, но это не то что нужно. Я так понимаю событие срабатывает сразу после окончания передачи файлов серверной части, а сколько там сервер обрабатывает и сохраняет, клиентскую часть не интересует.
Хотелось бы увидеть все таки прогресс в целом, до момента оповещения пользователя о том, что все ОК.

Последний раз редактировалось Lion_astana, 26.04.2018 в 15:25.
Ответить с цитированием
  #2 (permalink)  
Старый 27.04.2018, 20:51
Аспирант
Отправить личное сообщение для Lion_astana Посмотреть профиль Найти все сообщения от Lion_astana
 
Регистрация: 19.11.2010
Сообщений: 48

Уже второй день бьюсь, вроде решил большинство моментов, остался один - IE

Никак не могу понять, почему IE10 (Есть подозрение что не только) не позволяет вызвать функцию изнутри себя?

Объявлял и через var, и через fuction, и через window - все равно изнутри себя не вызывается!!!!!!!!!!
Уже мозг поломал, во всех браузерах нормально, в IE не получается.

Сможет кто-нибудь подсказать?
Ответить с цитированием
  #3 (permalink)  
Старый 27.04.2018, 21:17
Аспирант
Отправить личное сообщение для Lion_astana Посмотреть профиль Найти все сообщения от Lion_astana
 
Регистрация: 19.11.2010
Сообщений: 48

Мне интересна строка

$(lb).load("/load/logo.php",function(){


внутри функции getLogo. Она именно подгружает код вывода логотипа если он есть с кнопкой "удалить", либо форму загрузки, если логотипа нет.

Получается после удаления логотипа я хочу снова вывести нужный кусок кода, но сообщение об успешном удалении появляется (после загрузки тоже появляется о том что файл загружен), за это отвечает строка:

showMsg(data.answer);


Смотрю в том же IE на console.log(getLogo), он функцию видит отлично, выполнять не хочет (((
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вызов функции при закритти окна браузера zerofx Events/DOM/Window 4 14.05.2015 10:37
Перестает работать галерея при загрузке через Ajax (Need help) Clodan jQuery 0 20.04.2015 20:18
Помогите сделать выполнение jquery при загрузке страницы acidjazzz jQuery 3 30.03.2015 14:27
Автоматический вызов функции при загрузке страницы DVMade Элементы интерфейса 2 02.03.2015 21:25
jQuery UI datepicker -- не биндится при загрузке mkrylov jQuery 4 20.05.2009 20:36