2011-10-26 151 views
0

我正在使用jQplot顯示一個圖形來監視數據。 要刷新持有該圖的div,我每5秒調用一次ajax調用(請參閱下面的JavaScript摘錄)。 在服務器上,PHP腳本從數據庫中檢索數據。 成功時,使用JavaScript setTimeout(ajax,5000)在5秒後重新調用ajax調用。 錯誤時,在顯示錯誤消息之前,使用setTimeout(ajax,5000)重試ajax調用10次。 監控XHR獲悉大約200次請求後瀏覽器崩潰。 作爲臨時補救措施,50次迭代後發佈location.reload()以防止瀏覽器崩潰。 這可行,但不是理想的情況。 對此問題的任何更好的解決方案非常感謝。ajax settimeout刷新div

感謝和問候,JZB

function ajax() { 
    $.ajax({ 
    cache: false, 
    url: 'monitor.php', 
    data : { x: id }, 
    method: 'GET', 
    dataType: 'json', 
    success: onDataReceived, 
    error: onDataError 
    }); 

    function onDataReceived(series) { 
    $('#chartdiv_bar').html(''); 
    $.jqplot('chartdiv_bar', [series['initHits']], CreateOptions(series,'Inits')); 

    errorcount = 0; 
    setTimeout(ajax, 5000); 
    } 

    function onDataError(jqXHR, textStatus, errorThrown) { 
    errorcount++; 
    if (errorcount == 10) { 
     alert("No server response:\n\n" + textStatus + "\n" + errorThrown); 
    } else { 
     setTimeout(ajax, 5000); 
    } 
    } 
} 

回答

1

好還是失敗Ajax調用後,既然你再呼叫阿賈克斯(),你開始多個定時器。這就是您的瀏覽器崩潰的原因。

你可能想嘗試清除當前的計時器,然後開始下一個定時器

var t; //global 

在每個回調函數:

if(t)  
clearTimeout(t); 
t = setTimeout(ajax, 5000); 

更多信息的計時器在這裏:w3 school

+0

感謝您的提示。建議使用clearTimeout不能解決問題。 監控XHR仍然顯示請求建立,直到瀏覽器崩潰,大約有200個請求。 我相信這些是ajax請求,而不是定時器請求,我想不出除了重新加載頁面來清除它們。 再次,非常感謝解決方案的建議。 – user1014584

+0

哦,抱歉,沒有工作。您是否嘗試從代碼中刪除jqplot調用?也許可以使用提示語句。只是爲了排除jqplot的問題。 – CW30Meters

0

我按照建議刪除了jqplot調用,並且問題消失了。

顯然jqplot是罪魁禍首,我發現了許多涉及jqPlot內存泄漏的條目。
我使用jQuery 1.6.4,並安裝jqPlot圖表版本1.0.0b2_r792,這應該解決內存泄漏問題。

此外,我換成

$('#chartdiv_bar').html(''); 

$('#chartdiv_bar').empty(); 

謝謝您的支持。