【问题标题】:Google Chrome: XMLHttpRequest.send() not working while doing POST谷歌浏览器:XMLHttpRequest.send() 在做 POST 时不起作用
【发布时间】:2010-01-07 17:04:43
【问题描述】:

我正在开发一个应用程序,该应用程序允许用户使用表单(POST 请求)发送文件,并在上传文件时执行一系列 GET 请求以收集有关上传状态的信息.

它在 IE 和 Firefox 中运行良好,但在 Chrome 和 Safari 中就不行了。

问题在于,即使在 XMLHttpRequest 对象上调用了 send(),也没有任何请求,如 Fiddler 中所示。

更具体地说,在表单的“提交”事件上放置一个事件处理程序,在窗口上放置一个超时函数调用:

window.setTimeout(startPolling, 10);

在这个函数中,“startPolling”序列被启动,不断触发 GET 请求以接收来自 Web 服务的状态更新,该 Web 服务返回可用于更新 UI 的文本/json。

这是基于 WebKit 的浏览器的限制(也许是安全方面的限制?)?这是 Chrome 错误吗? (不过,我在 Safari 中看到了相同的行为)。

【问题讨论】:

  • 我没听说过。其他基于 AJAX 的上传进度指示器在 Chrome 中对我来说工作正常。让我们再写一些代码/一个测试用例。
  • 是否等待上一个轮询请求完成后再发送下一个?
  • 确实如此。处理一个请求会触发下一个新的 setTimeout。不过,除了 POST,没有人会出去。

标签: javascript ajax google-chrome


【解决方案1】:

我遇到了完全相同的问题。目前我使用一个 iframe,它以表单为目标。这允许在发布时执行 xhr 请求。虽然这确实有效,但如果有人禁用 javascript,它不会优雅地降级。(我无法在没有 js 的情况下在 iframe 之外加载下一页)所以如果有人有更好的解决方案,我会很高兴听到它。

这里是 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.
});
});

【讨论】:

    猜你喜欢
    • 2011-02-15
    • 2018-12-07
    • 2015-06-16
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多