Подтвердить что ты не робот

Доступен ли объект FormData в Internet Explorer 10?

Я пишу небольшое приложение JavaScript, которое позволяет загружать изображения асинхронно.

Этот script работает потрясающий в каждом браузере, за исключением, угадайте, кто, Internet Explorer...

Итак, первое, что я сделал, - создать резерв для версий IE9 с плагином AjaxForm для jQuery, который отлично работает!

Здесь JS script.

$("#Uploader").change(function(e){
        var form = $("#UploaderForm");
        form.trigger('submit');
        $(this).attr('disabled','disabled');
        e.preventDefault();
});
$("#UploaderForm").submit(function(e){
        e.preventDefault();
        e.stopPropagation();
        var type="POST";var loading=$("#PhotoIsLoading");
        if(windowApi === true){
            var formData = new FormData($(this)[0]);
            $.ajax({
                url: url,
                type: type,
                xhr: function() {
                    myXhr = $.ajaxSettings.xhr();
                    if(myXhr.upload){ myXhr.upload.addEventListener('progress',progressHandlingFunction, false);}
                    return myXhr;
                },
                beforeSend: function(){loading.removeClass('isHidden_important');},
                success: function(response){
                    jres = JSON.parse(response);
                    alert("Test ok, file uploaded");
                },
                error: function(response){console.warn(response);},
                data: formData, 
                cache: false,
                contentType: false,
                processData: false
            });
            e.preventDefault();
        }else{
            $(this).ajaxSubmit({
                url: url,
                dataType: 'json',
                type: type,
                beforeSubmit: function(){loading.removeClass('isHidden_important');$(this).formSerialize();},
                success:function(response){
                    jres = JSON.parse(response);
                    alert("FallbackTest Complete");
                },
                error: function(response){console.warn(response);},
            });
            e.preventDefault();
            return false;
        }
    });

WindowApi, и каждая другая переменная определена в глобальном script, но не волнуйтесь, они работают. Если быть точным, WindowApi:

var windowApi=true;
if(window.File&&window.FileReader&&window.FileList&&window.Blob){
console.log("window.api ready");windowApi=true;}
else{console.log("window.api not ready");windowApi=false;};

Итак, с этой связкой строк кода я обрабатываю каждый браузер и IE9-браузеры...

Теперь проблема связана с IE10, поскольку она имеет все методы window.* и может использовать объект FormData. Но когда я пытаюсь загрузить что-то с помощью IE10 и FormData, я получаю сообщение "Отказано в доступе" для объекта formData.

HTML, который участвует в этом процессе:

<form name="UploaderForm" id="UploaderForm" method="post" enctype="multipart/form-data">
    <input type="file" name="Uploader" id="Uploader" accept="image/*" tabindex="1" />
</form>

Итак, в конце мой вопрос:

Как я могу избежать исключения "Отказано в доступе" в IE10 при попытке получить доступ к объекту FormData?

4b9b3361

Ответ 1

fooobar.com/questions/406620/... и fooobar.com/questions/16578/... могут быть полезны. IE довольно строг о том, что вы можете сделать с программным обеспечением <input type='file'>.

Основываясь на первом, меняет ли первая строка на это исправление?

$("#Uploader").on('click', function(e){ /* rest of the function unchanged... */

Ответ 2

Вы получаете отказ в доступе при отправке формы, в которой есть поля, которые были испорчены javascript. Вы динамически добавили атрибут disabled в поле загрузки, это может быть причиной того, что вы получаете Access denied. Может быть, вы должны сделать снимок без отключения поля в событии change?

Кстати, вам может быть лучше проверить доступность FormData в сочетании с File API:

var formDataSupport = false;
if (typeof FormData === 'function' && 
    window.File && 
    window.FileReader && 
    window.FileList && 
    window.Blob)
{
  console.log("File API available, formData available");  
  formDataSupport = true; 
}