2010-08-03 122 views
2

我使用以下代碼在主瀏覽器的url更改時調用一個函數。只發送一次Ajax請求一次

var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
        .getInterface(Components.interfaces.nsIWebNavigation) 
        .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
        .rootTreeItem 
        .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
        .getInterface(Components.interfaces.nsIDOMWindow); 

     mainWindow.getBrowser().addEventListener("DOMContentLoaded",function(){ getFromDB();}, false); 

getFromDB()發送到服務器

request = new XMLHttpRequest(); 
request.open("GET", "http://www.mydomain.com/getJSON.php", true); 
request.onreadystatechange = sendData; 

一切正常的請求,但問題是該請求被髮送到服務器進行無限的次數。如果瀏覽器在loacalhost中加載頁面,則該請求只發送一次。

我想限制每個頁面加載/請求(或URL更改)只發送一次請求。

我已經使用了一些布爾檢查。但他們不工作。

var check=0; 
if(check==0) 
{ 
check=1; 
getFromDb(); 
} 

在第一線addEventListener內:8 幫我弄這個。

回答

0

您需要爲

if(window.check==0||typeof(window.check)=="undefined") 
{ 
window.check=1; 
getFromDb(); 
} 
+0

我甚至使用過全局變量。但我沒有得到結果。 – 2010-08-03 12:03:09

0

的全局變量,這條線是否正確?如果我假設函數名稱爲sendData,那麼它可能會在就緒狀態變化時再次發送數據:

request.onreadystatechange = sendData; 

sendData在做什麼?

+0

'sendData'是一個函數。這一行正在調用'onreadystatechange'。 – 2010-08-03 12:02:16

+0

也許sendData再次進行ajax調用。 onreadystatechange將被調用幾次(4) – naikus 2010-08-03 12:18:39

0
var listener = function(e){ 
    getFromDB(); 
    mainWindow.getBrowser().removeEventListener("DOMContentLoaded",listener, false); 
} 

mainWindow.getBrowser().addEventListener("DOMContentLoaded", listener, false) 

反正就是這樣。

不要引入全局變量或標誌,只需正確使用監聽器系統即可。

+0

這看起來似乎有部分工作。一旦頁面刷新/重新加載,eventlistener將從DOM中刪除。 我想加載URL更改事件監聽器,相應的功能只應調用一次。 – 2010-08-03 12:10:38

0

我也認爲你需要一個全局變量。使用全局var和內部getFromDb(),將var的值更改爲某些內容,以便可以檢查此var是否已設置。

var check = 0; 
if (check == 0) { 
getFromDb(); 
} 

function getFromDb() { 

.... 
... 
check = 1; 
... 
}