2010-01-07 32 views
4

我正在研究一個應用程序,允許用戶使用表單(POST請求)發送文件,並執行一系列GET請求正在上傳文件以收集關於上傳狀態的信息。Google Chrome:XMLHttpRequest.send()在開機自檢時不工作

它在IE和Firefox中運行良好,但在Chrome和Safari中並沒有那麼多。

問題是即使在XMLHttpRequest對象上調用了send(),也沒有任何要求可以在Fiddler中看到。

更具體的事件處理程序被放置在表格的「提交」事件,即放置在窗口上超時函數調用:

window.setTimeout(startPolling, 10); 

,並在此功能「startPolling」序列開始,保持發射GET請求以接收來自返回可用於更新UI的文本/ json的web服務的狀態更新。

這是基於WebKit的瀏覽器的一個限制(可能是安全方面?)?這是Chrome的錯誤嗎? (儘管我在Safari中看到了相同的行爲)。

+0

這並不是說我聽說過的。在Chrome中,其他基於AJAX的上傳進度指示器對我來說工作正常。讓我們來看一些更多的代碼/測試用例。 – bobince 2010-01-07 21:02:28

+0

在發送下一個請求之前是否等待先前的輪詢請求完成? – 2010-01-07 22:00:05

+0

它的確如此。處理請求觸發下一個請求的新setTimeout。儘管如此,沒有人會出去但是發佈POST。 – 2010-01-07 22:34:39

回答

2

我有完全相同的問題。目前我使用的是一個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. 
}); 
});