Рекурсивный вызов в 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-е результат. Так вот, результат в див выводится сразу, а загрузка продолжается дальше, но это не то что нужно. Я так понимаю событие срабатывает сразу после окончания передачи файлов серверной части, а сколько там сервер обрабатывает и сохраняет, клиентскую часть не интересует. Хотелось бы увидеть все таки прогресс в целом, до момента оповещения пользователя о том, что все ОК. |
Уже второй день бьюсь, вроде решил большинство моментов, остался один - IE
Никак не могу понять, почему IE10 (Есть подозрение что не только) не позволяет вызвать функцию изнутри себя? Объявлял и через var, и через fuction, и через window - все равно изнутри себя не вызывается!!!!!!!!!! Уже мозг поломал, во всех браузерах нормально, в IE не получается. Сможет кто-нибудь подсказать? |
Мне интересна строка
$(lb).load("/load/logo.php",function(){ внутри функции getLogo. Она именно подгружает код вывода логотипа если он есть с кнопкой "удалить", либо форму загрузки, если логотипа нет. Получается после удаления логотипа я хочу снова вывести нужный кусок кода, но сообщение об успешном удалении появляется (после загрузки тоже появляется о том что файл загружен), за это отвечает строка: showMsg(data.answer); Смотрю в том же IE на console.log(getLogo), он функцию видит отлично, выполнять не хочет ((( |
Часовой пояс GMT +3, время: 16:43. |