Google Chrome: XMLHttpRequest.send () не работает во время выполнения POST - PullRequest
4 голосов
/ 07 января 2010

Я работаю над приложением, которое позволяет пользователю отправлять файл с помощью формы (запрос POST), и которое выполняет серию запросов GET во время загрузки этого файла, чтобы собрать информацию о состоянии загрузки .

Отлично работает в IE и Firefox, но не так много в Chrome и Safari.

Проблема в том, что хотя send () вызывается для объекта XMLHttpRequest, ничего не запрашивается, как это видно в Fiddler.

Чтобы быть более точным, обработчик событий помещается в событие "submit" формы, которое помещает вызов функции тайм-аута в окно:

window.setTimeout(startPolling, 10);

и в этой функции запускается последовательность «startPolling», которая продолжает генерировать GET-запросы на получение обновлений статуса от веб-службы, которая возвращает текст / json, который можно использовать для обновления пользовательского интерфейса.

Является ли это ограничением (возможно, в плане безопасности?) В браузерах на основе WebKit? Это ошибка Chrome? (Я вижу такое же поведение в Safari).

1 Ответ

2 голосов
/ 15 марта 2010

У меня точно такая же проблема. На данный момент я использую iframe, который ориентирован на форму. Это позволяет выполнять запросы xhr при публикации. Хотя это работает, оно не ухудшается, если кто-то отключает javascript (я не могу загрузить следующую страницу вне iframe без js) Так что, если у кого-то есть более подходящее решение, я был бы рад услышать его.

Вот скрипт jQuery для справки:

$(function() {
$('form[enctype=multipart/form-data]').submit(function(){ 
    // Prevent multiple submits
    if ($.data(this, 'submitted')) return false;

    var freq = 500; // freqency of update in ms
    var progress_url = '{% url checker_progress %}'; // ajax view serving progress info 

    $("#progressbar").progressbar({
        value: 0
    });

    $("#progress").overlay({ 
        top: 272, 
        api: true,
        closeOnClick: false,
        closeOnEsc: false, 
        expose: { 
            color: '#333', 
            loadSpeed: 1000, 
            opacity: 0.9 
        }, 
    }).load();

    // Update progress bar
    function update_progress_info() {
        $.getJSON(progress_url, {}, function(data, status){ 
            if (data) {
                var progresse = parseInt(data.progress);
                $('#progressbar div').animate({width: progresse + '%' },{ queue:'false', duration:500, easing:"swing" }); 
            }
            window.setTimeout(update_progress_info, freq);
        });
    };
    window.setTimeout(update_progress_info, freq);

    $.data(this, 'submitted', true); // mark form as submitted.
});
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...