2010-08-03 3 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

Я использовал глобальные переменные. Но я не получаю результат. –

0

Является ли эта линия правильно? Если я предполагаю, что имя функции как SendData то он может посылать данные снова на готовом изменении состояния:

request.onreadystatechange = sendData; 

Что SendData делать?

+0

'sendData' - это функция. Эта строка вызывает 'onreadystatechange'. –

+0

Возможно, sendData снова выполняет вызов ajax. Onreadystatechange будет вызываться несколько раз (4) – naikus

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

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

Что-то вроде этого в любом случае.

Не вводите глобалы или флаги, просто используйте систему слушателя правильно.

+0

Это кажется частично работающим. Сразу страница обновляется/перезагружается, eventlistener удаляется из DOM. Я хочу загрузить прослушиватель событий при изменении URL, и соответствующую функцию нужно вызывать только один раз. –

0

Я также считаю, что вам нужен глобальный var. Используйте глобальный var и внутри getFromDb(), измените значение var на что-то, чтобы вы могли проверить, установлен ли этот var или нет.

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

function getFromDb() { 

.... 
... 
check = 1; 
... 
} 
Смежные вопросы