2014-04-28 20 views
0

我有一個php應用程序,其中每隔2分鐘將.load()大量內容放入div。瀏覽器(我必須爲IE8構建它)通常在重新加載數據幾分鐘後開始減慢。 我已經知道原因 - 只要頁面本身已加載,內存就不會擺脫之前加載的數據。。在間隔中使用時發生性能問題

有沒有辦法做到這一點,以便內存不會在幾次/多次重新加載後被淹沒?

我發現這一點:

jQuery load() method memory leak?

和涼爽的答案在這裏(見全螺紋https://stackoverflow.com/a/2180355/3424808):

這不是一個完整的答案,但我很快就發現如何用最少的更改修復我的所有代碼。在我的「鹼」 JS類(這是通過類名等爲標準按鈕進行連接的每一個頁面上使用的對象)添加以下方法,該方法確實爲欺騙處理程序檢查:

BindOnce: function(triggerName, fn) { 
    function handlerExists(triggerName, theHandler) { 
     function getFunctionName(fn) { 
      var rgx = /^function\s+([^\(\s]+)/ 
      var matches = rgx.exec(fn.toString()); 
      return matches ? matches[1] : "(anonymous)" 
     } 
     exists = false; 
     var handlerName = getFunctionName(theHandler); 
     if ($(document).data('events') !== undefined) { 
      var event = $(document).data('events')[triggerName]; 
      if (event !== undefined) { 
       $.each(event, function(i, handler) { 
        if (getFunctionName(handler) == handlerName) { 
         exists = true; 
        } 
       }); 
      } 
     } 
     return exists; 
    } 
    if (!handlerExists(triggerName, fn)) { 
     $(document).bind(triggerName, fn); 
    } 
} 

然後我只是調用它而不是綁定方法!

但我不能得到這個工作(當我重寫簡單的工作.bind()FN它停止工作)。 有沒有辦法實現這一點的其他方式?

或者有人能幫我用我發佈的腳本嗎?當我將它分配給按鈕時什麼都不做。 我使用的功能,如:

$('#myButtonID').BindOnce("click", function() { 
    alert("User clicked on 'foo.'"); 
}); 

它可以用於簡單.bind()

編輯

繼承人原.load()這就是我的命。

<script type="text/javascript"> 
var skill = <?php echo json_encode($skill_, JSON_UNESCAPED_UNICODE); ?>; 
var skill_final = <?php echo json_encode($skill_final, JSON_UNESCAPED_UNICODE); ?>; 
var camp_final = <?php echo json_encode($camp_final, JSON_UNESCAPED_UNICODE); ?>; 
var jmeno = <?php echo json_encode($jmeno_, JSON_UNESCAPED_UNICODE); ?>; 
var pozice = <?php echo json_encode($pozice_, JSON_UNESCAPED_UNICODE); ?>; 
var delka = <?php echo json_encode($delka_, JSON_UNESCAPED_UNICODE); ?>; 
var opravneni = <?php echo json_encode($opravneni, JSON_UNESCAPED_UNICODE); ?>; 

$(document).ready(function(){ 
    refreshPrehled(); 
}); 
function refreshPrehled(){ 
    $('#checkboxes').load('load_prehled.php', { 
    skill: skill, 
    skill_final: skill_final, 
    camp_final: camp_final, 
    jmeno: jmeno, 
    pozice: pozice, 
    delka: delka, 
    opravneni: opravneni 
    }, function(){ 
    setInterval(refreshPrehled, 120000); 
    }); 
} 
</script> 
+0

'重新加載'表明您正在多次加載相同的數據。難道你不能跟蹤已經加載的服務器並只發送新的/已更改的內容嗎? – jeroen

+0

@jeroen我有一個腳本,每2分鐘用更新的數據重寫少量.txt文件,並基於此重構表格。 – IRMA

+0

你能展示你實際使用的代碼嗎?你使用的是什麼版本的jQuery?目前這看起來像一個x/y問題,你有問題x,並嘗試用y解決它,並試圖找出爲什麼y不工作時,你真的應該看看x。 http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem –

回答

2

你重新創建在功能上的每個呼叫的setInterval,你應該改爲使用setTimeout。使用您當前的代碼,函數的第一個調用將發送一個ajax請求,然後在120000ms之後它將被執行兩次,然後120000ms之後它將被執行4次,以此類推。使用setTimeout代替停止,因爲它只執行一次函數。

$(document).ready(function(){ 
    refreshPrehled(); 
}); 
function refreshPrehled(){ 
    $('#checkboxes').load('load_prehled.php', { 
     skill: skill, 
     skill_final: skill_final, 
     camp_final: camp_final, 
     jmeno: jmeno, 
     pozice: pozice, 
     delka: delka, 
     opravneni: opravneni 
    }, function(){ 
     setTimeout(refreshPrehled, 120000); 
    }); 
} 
+0

並與setTimeout它不會洪泛記憶?無論如何,像30重新加載後呢? – IRMA

+0

理論上它不會,等待load_prehled.php返回當然。用一個較小的延遲測試它,例如10秒,並在監視內存時保持一小時。 –

+0

yee ...我之前有過Timeout,但它不適用於頁面的其他部分,所以我嘗試了不同的間隔調用,可能會誤讀情況。謝謝你的幫助隊友! :)讓它驚人的在這裏<3 – IRMA

相關問題