2017-03-19 92 views
0

有時,jQuery的文檔讓我覺得自己很笨。使用jQuery進度條顯示長時間運行的PHP腳本的進度

我有一個使用PHP的服務器上處理多個訂單的創建(有時上千)的應用程序。我試圖找出如何讓該腳本(通過$ .ajax調用)通知UI的狀態。

我瞭解$ .ajax中的.onprogress,.success和.complete元素,但我無法找到PHP腳本將數據提供給每種事件類型的示例。

在old-school javascript中,使用ajax.readyState,您可以從腳本獲取PHP.echo()事件以獲得進度目的,然後使用PHP.exit()事件完成請求。

怎樣才能做到這一點在$就世界?

從老狗非常感謝努力學習新的技巧。

回答

0

找出了蠻力的方式。

每次回波時間()從服務器端,該束傳遞給onprogress處理程序作爲e.target.responseText。請注意,responseText的繼續與每個響應成長,所以你需要一個客戶端的變量,以保持其先前長度的軌道:

var this_str, last_len = 0; 
... 
onprogress: function (e) { 
    this_str = e.target.responseText.substr(last_len); 
    ...do something with this_str... 
    last_len = e.target.responseText.length; 
} 
... 

如果結果是JSON,你需要解碼this_str(不responseText的)。這對於不同的技術來說效果最好,因爲根據服務器更新的頻率,分析可能會超載。由於您發送的是json對象,整個responseText字符串是一系列json對象,由大括號和大括號開頭「} {」分隔。因此,打破它分成幾部分,並使用最新的:

var subtext, parts, json; 
... 
onprogress: function (e) { 
    parts = e.target.responseText.split('}{'); 
    if (parts.length > 1) { 
     subtext = '{' + parts[parts.length - 1]; 
    } else { 
     subtext = parts[0]; 
    } 
    json = JSON.parse(subtext); 
    ... 

成功函數使用了JSON了類似的方法:

success: function (text) { 
    parts = text.split('}{'); 
    if (parts.length > 1) { 
     subtext = '{' + parts[parts.length - 1]; 
    } else { 
     subtext = parts[0]; 
    } 
    json = JSON.parse(subtext); 
    ... 

注意,會有一對夫婦未有用onprogress事件東西開始;一定要測試這些,並忽略它們。

當您的服務器端函數終止或exit()s時,您的成功函數和onprogress函數都將收到完整的responseText字符串。如果你想成功做一些不同的事情,記得跟蹤responseText中的最後一個字符串。