2015-07-20 81 views
-1

我正在構建一個動態網站,通過jquery的load()將所有頁面加載到「body」div中。問題是我有一個腳本循環與加載的PHP頁面內的setInterval,原因是我希望只有當該頁面顯示時加載腳本。現在我發現腳本在「離開」頁面後仍然運行(在沒有刷新的情況下在div內加載其他內容),並且如果我繼續離開/返回循環堆棧,使用GET請求(來自javascript)氾濫我的服務器。卸載通過load()加載的JS以避免重複?

離開頁面後卸載所有JS的好方法是什麼?我可以做一個簡單的虛擬變量來不加載腳本兩次,但是我想在離開頁面後停止循環,因爲它導致無用的流量和控制檯錯誤,因爲它應該填充的元素不再存在。

對不起,如果這已經被問到,但很難提出這個關鍵字。

回答

1

1)你爲什麼不試試clearInterval? 2)如果你有一個通用(主)function a() { ... }做的東西,你可以只用function a() { };覆蓋它什麼都不做 3)如果你空引用的東西就會被垃圾收集

沒有提供的代碼,所以沒有更多的我可以幫助你

+0

無需代碼,我將根據建議更改和修改我的建議。 clearInterval聽起來不錯,我會去那。也感謝這個壓倒一切的技巧,我現在知道這就是js的工作原理。 – aron9forever

+0

所有通用函數和變量在'window'中定義...所以,如果您有一個名爲'doSomething'的通用函數,您可以通過'window.doSomething'訪問它或者通過設置'window.doSomething = undef;' – Reflective

0

這聽起來像是你需要重新評估你的設計。要麼你需要刪除ajax,要麼你不需要在方法名稱中碰撞。

您可以查看此鏈接:http://www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml

這給如何從DOM中刪除的JavaScript信息。但是,現代瀏覽器會將代碼留在瀏覽器的內存中。

+0

將它們留在內存中是很好的,因爲它們很小且不相關(幾kb)。我所關心的是阻止他們跑步。你能給我一個關於如何使用這個鏈接中的信息用於內聯JavaScript的提示嗎?問題是我必須通過PHP生成它,因爲循環根據數據庫數據具有可變數量的請求 – aron9forever

0

由於你沒有處理真正的頁面加載/卸載,我會建立一個模擬卸載事件的系統。

var myUnload = (function() { 
    var queue = [], 
    myUnload = function() { 
     queue.forEach(function (unloadFunc) { 
     undloadFunc(); 
     }); 
     queue = []; 
    }; 

    myUnload.add = function (unloadFunc) { 
    queue.push(unloadFunc); 
    }; 
    return myUnload; 
}()); 

加載新的頁面應該只運行myUnload()它加載新的頁面之前的代碼。

function loadPage(url) { 
    myUnload(); 
    $('#page').load(url); 
} 

由一個頁面加載可撥打myUnload.add()註冊一個清理函數的任何代碼,應該在加載新頁面時運行。

// some .js file that is loaded by a page 
(function() { 
    var doSomething = function() { 
     // do something here 
    }, 
    timer = setInterval(doSomething, 1000); 

    // register our cleanup callback with unload event system 
    myUnload.add(function() { 
    // since all of this code is isolated in an IIFE, 
    // clearing the timer will remove the last reference to 
    // doSomething and it will automatically be GCed 
    // This callback, the timer var and the enclosing IIFE 
    // will be GCed too when myUnload sets queue back to an empty array. 
    clearInterval(timer); 
    }); 
}()); 
+0

因此,每個子頁面應該包含它自己的「銷燬」功能,清除同一頁面加載的腳本?當另一個子頁面被加載時,這個函數會調用destroy函數?這是非常有用的,因爲我想知道如何以非硬編碼的方式集成所有這些頁面 – aron9forever